【问题标题】:When a variable is declared in a T-SQL stored procedure, is it kept in memory or tempdb?在 T-SQL 存储过程中声明变量时,它是保存在内存中还是 tempdb 中?
【发布时间】:2012-03-15 21:55:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server tsql stored-procedures tempdb


    【解决方案1】:

    The Capacity Planning article for tempdb 回答您的问题:

    大对象数据类型有varchar(max)、nvarchar(max)、 varbinary(max) 文本、ntext、图像和 xml。这些类型最多可以有 2 GB 大小,可用作存储中的变量或参数 过程、用户定义的函数、批处理或查询。参数 和定义为 LOB 数据类型的变量使用主存储器作为 如果值很小,则存储。但是,较大的值存储在 临时数据库。当 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 的大小......但我确信这会根据您的服务器可用的内存而有所不同。

    【讨论】:

    • 感谢您找到这个!我假设“如果值很小”意味着小于 8000 字节?无论如何,这篇文章似乎暗示非 MAX (N)VARCHAR 和小变量存储在内存中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2020-01-05
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多