我通常使用 Microsoft SQL Server Management Studio 2012 (11.0.3000.0),查询结果显示在网格中。截至 3 或 4 天前,查询结果一直很慢,但只是间歇性的。例如,一个简单的查询,例如
SELECT GETDATE()
将需要 7 秒(根据 SSMS)来显示当前日期/时间。如果我在启用跟踪/分析器的情况下运行查询,我可以看到查询几乎立即执行完成,即使 SSMS 计时器继续计时并且一段时间内没有显示任何结果。生成的日期/时间值与跟踪/分析器为“StarTime”列显示的日期/时间值相同。通常,查询将在 1 秒或更短的时间内返回,但如果我执行 5 或 6 次,我会发现问题,并且需要一段时间才能完成。
当这种情况发生时,我的四核笔记本电脑的 CPU 使用率将飙升至 25%(整个时间段内使用全核),直到绘制好网格。
我正在连接到本地服务器(在我的 LAN 上),该服务器负载很小,公司中似乎没有其他人遇到任何类似的问题。我安装了 SSMS 2014 以查看是否有帮助(没有帮助)。我认为这是一个绘制 DataGrid 本身的问题,因此我安装了 .NET 4.6,但这也无济于事。
当我将结果运行到文本时,它们每次都会在一秒内显示出来。
这似乎不是一个网络问题:
Reply from 192.168.10.47: bytes=32 time<1ms TTL=128
Ping statistics for 192.168.10.47:
Packets: Sent = 24, Received = 24, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
有人对我应该尝试的事情有什么建议吗?
我在 Windows 7 (x64) 上。
答案1
我能够通过运行查询来发现问题,同时监控进程SysInternalSuite 的进程监视器。在将查询结果显示到网格时,SQL Server Management Studio 会在 C:\Users\username\AppData\Local\Temp\ 中创建一个名为 tmp####.tmp 的 .tmp 文件(其中 # 是随机生成的字符)。
无论出于什么原因,我的临时目录已经充满了超过 40,000 个这样的文件(它们全部是空的),并且 Process Monitor 显示当我的查询没有显示结果时,它会抛出数千个“NAME COLLISION”错误,试图为它试图创建的临时文件想出一个新名称。
将查询结果显示为文本不会创建临时文件,这解释了为什么没有问题。
从该临时目录中删除所有 .tmp 文件立即解决了我的问题。
希望这对其他人有帮助。