Answers:
严重级别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中用于以下用途的任何空间其他对象。