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

问题描述 投票:2回答:1

假设我有一个存储过程:

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

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

NVARCHAR(50)

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

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

如何查看正在消耗的内存量?

sql-server stored-procedures memory memory-management
1个回答
2
投票

内存作为execution context的一部分分配给参数。

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

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

看到这个并不简单,但是您可以使用以下内容来查看页面数量随着添加更多参数而增加。

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' 
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.