我们正在尝试优化我们的一些 T-SQL 存储过程以减少 tempdb 争用,但我无法弄清楚 SQL 服务器如何存储非表变量:
- 像 INT 和 DATETIME 这样的简单数据类型呢?感觉他们会活在记忆中。
- 那么 VARCHARs/VARCHAR(MAX) 呢?常规 VARCHAR 可以存在于内存中,但 VARCHAR(MAX) 可能需要使用 tempdb 进行存储。
- 表变量存储在 tempdb 中。不过这些我都不是很感兴趣。
关于 tempdb的MSDN 文章没有解释常规变量。
我们正在尝试优化我们的一些 T-SQL 存储过程以减少 tempdb 争用,但我无法弄清楚 SQL 服务器如何存储非表变量:
关于 tempdb的MSDN 文章没有解释常规变量。
tempdb 的容量规划文章回答了您的问题:
大对象数据类型有 varchar(max)、nvarchar(max)、varbinary(max) text、ntext、image 和 xml。这些类型的大小最大可达 2 GB,并且可以用作存储过程、用户定义的函数、批处理或查询中的变量或参数。如果值很小,定义为 LOB 数据类型的参数和变量使用主存储器作为存储。但是,较大的值存储在 tempdb 中。当 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 的大小......但我确信这会根据您的服务器可用的内存而有所不同。
“表变量存储在 tempdb 中。不过这些我并不真正感兴趣。”
通常是的,表变量存储在 tempdb 中,但这可以通过内存优化表变量进行更改。
D.场景:表变量可以MEMORY_OPTIMIZED=ON
传统的表变量表示 tempdb 数据库中的表。为了获得更快的性能,您可以对表变量进行内存优化。
内联语法不支持内存优化。因此,让我们将内联语法转换为 TYPE 的显式语法。
CREATE TYPE dbo.typeTableD AS TABLE
(
Column1 INT NOT NULL INDEX ix1,
Column2 CHAR(10)
) WITH (MEMORY_OPTIMIZED = ON);
DECLARE @tvTableD dbo.typeTableD;
INSERT INTO @tvTableD (Column1) values (1), (2);
SELECT * FROM @tbTableD;
内存优化表变量不驻留在 tempdb 中。内存优化导致速度提高,通常快 10 倍或更多。