在T-SQL存储过程中声明变量时,它是保存在内存还是tempdb中?

时间:2012-03-15 21:55:03

标签: sql-server tsql stored-procedures tempdb

我们正在尝试优化一些T-SQL存储过程以减少tempdb争用,但我无法弄清楚SQL服务器如何存储非表变量:

  • INT和DATETIME等简单数据类型怎么样?感觉就像他们活在记忆中一样。
  • VARCHARs / VARCHAR(MAX)怎么样?常规VARCHAR可以存在于内存中,但VARCHAR(MAX)可能需要使用tempdb进行存储。
  • 表变量存储在tempdb中。这些我对此并不感兴趣。

MSDN article on tempdb不解释常规变量。

2 个答案:

答案 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倍甚至更多。