假设我有一个存储过程:
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] 删除。
我来说两句