可怕的SQL读取性能(罪魁祸首更新统计数据?)

sOl*_*tan 3 t-sql sql-server performance

我正在运行SQL Server 2008 R2并尝试微调性能.我做了我能做的一切:

  • 代码审查sql代码
  • 我认为合适的创建或删除索引
  • 自动创建统计数据
  • 自动更新统计数据
  • 自动更新统计信息异步开启

我有一个24/7系统,可以不断存储数据.有时我们会做读取,这就是问题所在.有时读取需要几秒钟或更短时间(这对我们来说是预期和可接受的),有时,读取需要几秒钟,可能在存储过程完成之前一分钟,我们在UI上呈现数据.如果我们再次阅读,它会更快.SQL事件探查器将跟踪花费几秒钟的特定SP或查询.我们会放大那个SP,尽我们所能做我们可以做的一切来优化它.我还跟踪了auto stats事件和重新编译事件.很难判断是否正在更新统计信息导致读取花费很长时间,或者重新编译是否导致了这种情况.有时候,我看到分析器跟踪了读取查询的重新编译,这会花费几个不可接受的时间,有时则不会跟踪重新编译.

我试图阻止查询优化器阻止读取,直到它使用选项使用计划xml等重新编译或更新统计信息.但我遇到编译错误抱怨查询计划xml无效; 这可能是真的,因为查询是安静的:select + join涉及本地表var.我有点黑客攻击xml,也许这就是为什么它认为它无效.所以我放弃了使用计划提示.

我们尝试定期(每15分钟)手动运行更新统计数据,以尽可能多地保持统计数据最新,但这会损害性能.updatestats阻止写入,我确信甚至读取; updatestats似乎保持了一堆统计数据,平均而言大约需要80-90秒.等待那么久的阅读是不可接受的.

所以我的想法是让读取发生并防止重新编译/更新stat阻止它的情况,对吗?完全禁用自动统计数据有意义吗?或者在删除所有自动创建的统计数据后禁用自动创建统计数据?这可能与MS推荐相反,因为它们默认启用自动创建统计数据和自动更新统计数据,性能可能会受到影响,但您可以提供任何想法/提示.

问候

San*_*ddy 8

根据您的解释,看起来下面(全部或部分)可能正在发生.

  1. 你正在进行物理读取.避免这种情况的快速方法是增加你在框中抛出的RAM量.您尚未提及服务器的硬件规格.请添加详细信息.
  2. 如果跟踪SQL调用,则可以轻松找出RECOMPILE发生的原因.查看EventSubClass以找出原因并努力解决这个问题.参考:http://msdn.microsoft.com/en-us/library/ms187105.aspx
  3. 你提到了表变量.这些因在不在正确的地方使用而导致性能问题而臭名昭着.如果在JOIN中使用表变量,并行计划是不可能的,也没有统计数据.我不确定你使用的方式和位置,但尝试用临时表替换它们.从SQL Server 2005开始,您将只获得STMT重新编译,而不是像2000年那样完整的SP重新编译.
  4. 您提到了Update Stats ASYNC选项,这不会阻止查询.
  5. 这台服务器上的TOP WAIT STATS是什么?您是否根据CPU,逻辑读取和执行计数确定了昂贵的过程?
  6. 您是否使用虚拟文件统计数据DMV查看了页面预期寿命,IO数量?
  7. 每15分钟更新一次统计数据并不是一个好计划.数据插入系统的频率是多少?您使用的采样率是多少?您的索引维护策略是什么?
  8. 你看过缺失的指数DMV吗?

使用以下查询以更精细的方式识别问题有很多好的查询.

参考:http://dl.dropbox.com/u/13748067/SQL%20Server%202008%20Diagnostic%20Information%20Queries%20%28April%202011%29.sql

还有很多其他的东西要看,但上面是一个很好的起点.

  • 与Glenn Berry的诊断信息查询的链接非常棒.其中有许多有用的查询可帮助诊断性能问题. (2认同)