【问题标题】:Where is memory allocated for a T-SQL variable?为 T-SQL 变量分配的内存在哪里?
【发布时间】:2012-05-16 13:40:04
【问题描述】:

在 T-SQL 中,当我们执行类似的操作时

declare @PolicyId int = 20

分配了 4 个字节,因为 int 的大小是 4 个字节,但是 分配此内存的位置 - 是在堆栈上还是在堆上?

【问题讨论】:

  • 而你需要知道的原因是……?
  • 我正在审查一个存储过程,在一个 while 循环中声明了一个变量,我想知道这会引起什么,垃圾收集(堆)或堆栈溢出。
  • 也许您应该更担心消除循环,而不是弄清楚当它弄脏床时会发生什么确切类型的异常。
  • 它可能取决于声明的上下文,例如在存储过程或循环中,以及数据类型,例如INT 而不是 TABLE
  • @Pritesh 我不相信。几乎 T-SQL 中的每个循环都可以更改为没有循环的基于集合的操作。有时最好将其留在循环中,但这很少见(运行总计是一种情况,在 SQL Server 2012 之前,游标的性能优于纯粹的基于集合的解决方案)。如果您担心您的循环会炸毁您的服务器,那么可能值得考虑,而不是举起手来相信循环是必要的。

标签: sql-server tsql memory heap-memory stack-memory


【解决方案1】:

T-SQL 变量既不在堆栈上,也不在堆上。它们在当前执行上下文中被命名为逻辑实体。将声明放在循环内与将其放在循环外相同。通过将变量放在循环中,您不会导致内存耗尽或堆栈溢出。见以下代码:

declare @i int =0
while @i<2
begin
    declare @x int = 0;
    set @x += 1
    print @x;
    set @i += 1;
end

print @x;

注意@x 是如何在循环外引用的,即使是在循环内声明的。 IE。循环没有创建了一个范围。但是初始赋值确实在循环的每次迭代中都被执行(打印的值总是1,而不是1,2,3...)。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2017-02-28
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多