Mon*_*ong 11 sql-server-2008 sql-server execution-plan
我们的一位客户刚刚升级到新服务器。
对于一个特定的存储过程,第一次执行它需要三分钟的时间来运行。后续运行不到 1 秒。
这让我相信最初的三分钟主要用于计算执行计划。后续运行只需使用缓存的计划并立即运行。
在我们的测试数据库上,计算相同程序的计划大约需要 5 秒。
我在计划本身中没有看到任何可怕的东西 - 尽管我不认为它是相关的,因为计划显示了运行查询需要多长时间,而不是计算本身。
该服务器为 16 核,24 GB 内存。不会发生沉重的 CPU 或内存负载。
是什么导致仅在特定数据库上计算如此缓慢?
我可以采取哪些步骤来找出问题的原因?
编辑
所以我设法访问服务器并使用SET SHOWPLAN_XML ON运行查询。
我可以确认查询的 CompileTime 占用了查询执行时间的 99%。该StatementOptmEarlyAbortReason是“超时”,我们与他们的数据库副本的原因是MemoryLimitExceeded测试数据库。
Mon*_*ong 10
我讨厌回答我自己的问题,特别是因为我从其他人那里得到了很多帮助来制定解决方案,但这里是。
问题是由于数据库中的一些无用统计数据造成的。查看执行计划,优化器期望从查询返回 11.5 tb 的数据。实际上是接收87kb。我现在知道返回的预期行和实际行之间的巨大不匹配表明统计数据已过时。
简单地运行
exec sp_updatestats
Run Code Online (Sandbox Code Playgroud)
强制数据库更新所有表的统计信息。
这将查询执行时间从 3 分钟缩短到 6 秒。每个人都是赢家!
感谢所有帮助的家伙。:0)