关于 tempdb 版本存储的问题

Tra*_*vis 9 sql-server tempdb-version-store sql-server-2014

今天我们遇到了一个错误:

错误:3967,严重性:17

据我所知,它基本上是“完整版商店”。这提出了一些我难以回答的问题,因为在我的商店,我们以前从未遇到过这个错误:

  • 如果有预设的最大大小(基于总tempdb大小或其他),它是动态的吗?

  • 如果不是,是否有设置可以使其动态化?

  • 我们可以基于此设置警报吗?(即用于跟踪大小等的 DMV)

Han*_*non 7

严重性 17 表示 SQL Server 用完了所需的资源。当数据库空间不足时,您通常会看到这种情况。在这种情况下,听起来像 tempdb 被用于读取已提交的快照隔离版本行,以用于需要溢出到 tempdb 的查询。

如果 tempdb 的最大大小有限并且尝试编写糟糕的查询(例如,执行非常大的交叉联接),这可能很常见。

您可以使用此查询来查看 tempdb 中版本存储的当前大小:

SELECT *
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE 'Version %';
Run Code Online (Sandbox Code Playgroud)

Technet 在https://technet.microsoft.com/en-us/library/cc966545.aspx#EDAA上有一篇关于版本存储使用的有趣文章

这个 MSDN 页面提到了错误 3967:

当 tempdb 空间不足时,数据库引擎会强制缩小版本存储。在收缩过程中,尚未生成行版本的运行时间最长的事务被标记为受害者。每个受害者事务的错误日志中都会生成一条消息 3967。如果事务被标记为受害者,则它无法再读取版本存储中的行版本。当它尝试读取行版本时,会生成消息 3966 并回滚事务。如果收缩过程成功,则 tempdb 中的空间变为可用。

我上面链接的页面都没有包含关于 tempdb 中版本存储的最大大小的明确建议,这让我相信唯一的限制是 tempdb 本身的最大配置大小,减去 tempdb 中使用的任何空间其他对象。