我们正在尝试优化一些 T-SQL 存储过程以减少 tempdb 争用,但我无法弄清楚 SQL Server 如何存储非表变量:
- 那么像 INT 和 DATETIME 这样的简单数据类型呢?感觉他们就活在记忆里了。
- VARCHAR/VARCHAR(MAX) 怎么样?常规 VARCHAR 可以驻留在内存中,但 VARCHAR(MAX) 可能需要使用 tempdb 进行存储。
- 表变量存储在 tempdb 中。不过这些我并不是很感兴趣。
The 有关 tempdb 的 MSDN 文章 http://msdn.microsoft.com/en-us/library/ms190768.aspx不解释常规变量。
tempdb 的容量规划文章 http://msdn.microsoft.com/en-us/library/ms345368.aspx回答你的问题:
大对象数据类型有 varchar(max)、nvarchar(max)、
varbinary(max) 文本、ntext、图像和 xml。这些类型最多可以有 2 个
GB大小,可作为变量或参数存储
过程、用户定义的函数、批处理或查询。参数
定义为 LOB 数据类型的变量使用主内存作为
如果值很小则存储。然而,大值存储在
临时数据库。当 LOB 变量和参数存储在 tempdb 中时,它们
被视为内部对象。您可以查询
sys.dm_db_session_space_usage 动态管理视图报告
分配给给定会话的内部对象的页面。
这篇文章值得全文阅读,因为它还涵盖了 tempdb 的许多其他用途。
编辑:如果您想知道特定会话在 tempdb 中使用了多少内存,您可以运行以下查询:
select *
from sys.dm_db_session_space_usage
where session_id = @@SPID
使用这个,它看起来不像我的VARCHAR(MAX)
变量存储在 tempdb 中,直到其大小达到大约 1000 KB...但我确信这会根据服务器可用的内存而有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)