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

Eva*_*n M 8 t-sql sql-server stored-procedures tempdb

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

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

关于tempdbMSDN文章没有解释常规变量.

Mic*_*son 11

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
Run Code Online (Sandbox Code Playgroud)

使用它,看起来我的VARCHAR(MAX)变量不是存储在tempdb中,直到它达到大约1000 KB的大小...但我确定根据服务器可用的内存而有所不同.