8

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

  • 像 INT 和 DATETIME 这样的简单数据类型呢?感觉他们会活在记忆中。
  • 那么 VARCHARs/VARCHAR(MAX) 呢?常规 VARCHAR 可以存在于内存中,但 VARCHAR(MAX) 可能需要使用 tempdb 进行存储。
  • 表变量存储在 tempdb 中。不过这些我都不是很感兴趣。

关于 tempdb的MSDN 文章没有解释常规变量。

4

2 回答 2

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

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

于 2012-03-15T22:07:52.550 回答
2

表变量存储在 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 倍或更多。

于 2019-03-30T21:29:58.070 回答