SQL Server如何以及何时占用变量的内存?

塔哈·苏丹·特穆里

假设我有一个存储过程:

CREATE PROCEDURE MY_SP  
    @LastName NVARCHAR(50),   
    @FirstName NVARCHAR(50)   
AS   
     /// my query here ///
GO  

然后我想用变量创建此过程后找到

NVARCHAR(50)

这些变量如何以及何时占用计算机内存,

SQL Server何时占用内存,何时创建或何时执行?

如何检查消耗了多少内存?

马丁·史密斯

将内存分配给参数作为执行上下文的一部分

当前正在执行查询的每个用户都具有一个数据结构,该数据结构包含特定于其执行的数据,例如参数值。该数据结构称为执行上下文。执行上下文数据结构被重用。如果用户执行查询而未使用结构之一,则会使用新用户的上下文重新初始化它。

执行上下文是在首次编译和缓存过程时创建的。如上所述,如果并发执行需要执行计划,则可以具有多个执行上下文。执行上下文包括8,192 byte存储器中的多个页面。因此,NVARCHAR(50)可以将81个参数放在单个页面上。

看到这一点并不容易,但是您可以尝试以下操作以查看随着添加更多参数而增加的页数。

CREATE OR ALTER PROCEDURE MY_SP  
@P1 nvarchar(4000) = NULL,    
@P2 nvarchar(4000) = NULL,    
@P3 nvarchar(4000) = NULL
AS 

GO

EXEC MY_SP

GO

SELECT m2.memory_object_address,
       m2.pages_in_bytes / m2.page_size_in_bytes AS pages_allocated_count,
       m2.page_size_in_bytes
FROM   sys.dm_exec_cached_plans cp
       JOIN sys.dm_os_memory_objects m1
         ON m1.memory_object_address = cp.memory_object_address
       JOIN sys.dm_os_memory_objects m2
         ON m1.page_allocator_address = m2.page_allocator_address
WHERE  cp.plan_handle = (SELECT ps.plan_handle
                         FROM   sys.dm_exec_procedure_stats ps
                         WHERE  ps.database_id = DB_ID()
                                AND ps.object_id = OBJECT_ID('MY_SP'))
       AND m2.type = 'MEMOBJ_EXECUTE' 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章