我遇到了一个 DBA 的问题,他声称表变量驻留在 tempdb 的 ldf 中,当大量数据加载到表变量中时,tempdb 的日志就会填满。
DBA 的解决方案是使用临时表而不是表变量。虽然我看到在大型数据集的情况下使用临时表的理由,但我不明白临时表是如何创建和存储在 tempdb 的 mdf 中的,而表变量存储在 ldf 中。有人可以请一些光吗?
我遇到了一个 DBA 的问题,他声称表变量驻留在 tempdb 的 ldf 中,当大量数据加载到表变量中时,tempdb 的日志就会填满。
DBA 的解决方案是使用临时表而不是表变量。虽然我看到在大型数据集的情况下使用临时表的理由,但我不明白临时表是如何创建和存储在 tempdb 的 mdf 中的,而表变量存储在 ldf 中。有人可以请一些光吗?
您的 DBA 是正确的,对表变量的操作记录到
tempdb
事务日志中,但对#temp
表的操作也是如此,因此建议的解决方案没有帮助。实际上,如果周围有任何用户事务,则#temp
表版本可能会更糟,因为在tempdb
完成之前无法截断日志。两者都在数据文件(mdf)中分配了它们的页面。
表变量“存储在ldf中”的理解是完全错误的。写入日志的所有内容都是回滚语句所需的信息(如果语句遇到错误并需要回滚,则需要)
您可以使用 . 查看所涉及的日志记录示例
sys.fn_dblog
。下面的脚本在表变量和表中插入几行#temp
并更新它们。示例结果
(与表变量相关的日志记录与系统生成的名称一起显示
#162F4418
在下面的输出中)脚本