我们在SQL Server 2014 SP1上有一个活动的OLTP 40GB数据库。发现查询随着IO_Completion等待而变慢,磁盘队列长度增加到900,并且SQL Server停止响应。我们尝试了什么:
重新启动实例,并在一分钟后开始以相同的方式运行。
第二次重新启动后,我们更改了每个tempdb数据文件的初始大小(创建了16个数据文件),它开始正常工作。
注意:我们将表变量用于中间结果集。这些结果集很小。
一个月内发生了两次。每次我手动向数据文件添加一点空间时,它就会开始正常工作。更有趣的是,我们在SQL Server 2008 R2和SQL Server 2012上使用的相同设置(相同的硬件,相同的文件夹和文件设置,相同的工作负载)可以正常工作。
请帮助我们找到永久的解决方案。
所有数据文件的初始大小都相同,为1000MB,当前为1500MB。都是一样的。每个自动增长为100MB。在此之前,我们面临着PFS和GAM页面争用的问题,我们增加到16个,问题得以解决。跟踪标记1117和1118均被启用。2个NUMA节点上的24个内核。所有数据文件都在同一卷上。简单磁盘,无SAN。
实例在物理计算机上。带表变量的查询和带哈希联接的查询是最常见的生成IO_Completion等待的方法。
wBob的详细回答促使我们进行了更详细的搜索。我们以前是怎么错过它的:
用户取消了数据库“ tempdb”中文件“ templog”的自动增长,或者在7704毫秒后超时。使用ALTER DATABASE可以为此文件设置较小的FILEGROWTH值,或显式设置新的文件大小。
每当发生这种类型的问题时,我们都会在日志中找到此问题。我们正在将TempDB移至单独的快速驱动器。