Sql server SQL Server如何以及何时为变量占用内存?

Sql server SQL Server如何以及何时为变量占用内存?,sql-server,stored-procedures,memory,memory-management,Sql Server,Stored Procedures,Memory,Memory Management,假设我有一个存储过程: CREATE PROCEDURE MY_SP @LastName NVARCHAR(50), @FirstName NVARCHAR(50) AS /// my query here /// GO 然后我想在用变量创建这个过程之后 NVARCHAR(50) 如何以及何时计算机内存被这些变量占用 SQL Server何时占用内存、何时创建或何时执行 如何检查消耗了多少内存?内存是为参数分配的,这是系统的一部分 当前执行

假设我有一个存储过程:

CREATE PROCEDURE MY_SP  
    @LastName NVARCHAR(50),   
    @FirstName NVARCHAR(50)   
AS   
     /// my query here ///
GO  
然后我想在用变量创建这个过程之后

NVARCHAR(50)
如何以及何时计算机内存被这些变量占用

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


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

内存是为参数分配的,这是系统的一部分

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

执行上下文是在第一次编译和缓存过程时创建的。如上文所述,如果并发执行需要,执行计划可以具有多个执行上下文。执行上下文由内存中的大量
8192字节
页组成。所以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'