假设我有一个存储过程:
CREATE PROCEDURE MY_SP
@LastName NVARCHAR(50),
@FirstName NVARCHAR(50)
AS
/// my query here ///
GO
然后我想用变量创建此过程后找到
NVARCHAR(50)
这些变量如何以及何时占用计算机内存,
SQL Server何时占用内存,何时创建或何时执行?
如何查看正在消耗多少内存?
答案 0 :(得分: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'