关于tempdb版本存储的问题


9

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

错误:3967,严重性:17

从我可以看出,它基本上是“完整版商店”。这引起了一些我很难回答的问题,因为在我的商店里,我们从未遇到过此错误:

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

  • 有没有可以使它动态化的设置?

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

Answers:


7

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

如果tempdb的最大大小受限制,并且尝试执行写得不好的查询(例如,执行非常大的交叉连接),则这可能很常见。

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

SELECT *
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE 'Version %';

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

此MSDN页面提到错误3967:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.