我们正在尝试优化一些T-SQL存储过程以减少tempdb争用,但我无法弄清楚SQL服务器如何存储非表变量:
MSDN article on tempdb不解释常规变量。
答案 0 :(得分:10)
The Capacity Planning article for 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的大小...但我确定根据内存的不同而变化你的服务器已经可用。
答案 1 :(得分:1)
“ 表变量存储在tempdb中。这些我并不是很感兴趣。”
通常是的,表变量存储在tempdb中,但是可以使用内存优化的表变量来更改。
Faster temp table and table variable by using memory optimization
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倍甚至更多。