【发布时间】:2011-04-19 20:03:37
【问题描述】:
我在 SQL Server 2008 R2 上运行并尝试微调性能。我尽我所能:
- SQL 代码的代码审查
- 创建或删除我认为合适的索引
- 自动创建统计信息开启
- 自动更新统计信息开启
- 自动更新统计信息异步开启
我有一个持续存储数据的 24/7 系统。有时我们会阅读,这就是问题所在。有时读取需要几秒钟或更短的时间(这对我们来说是可以预期和可以接受的)。其他时候,读取需要几秒钟,可能需要一分钟才能完成存储过程,然后我们在 UI 上呈现数据。
如果我们再次读取,它会更快。 SQL 探查器将跟踪需要几秒钟的特定存储过程或查询。我们会放大该存储过程,并尽我们所能优化它。
我还跟踪了自动统计事件和重新编译事件。很难判断是否正在更新统计信息导致读取需要很长时间,或者是否重新编译导致它。有时,我看到分析器跟踪读取查询的重新编译,这花费了几分钟不可接受的时间,其他时候它不跟踪重新编译。
我试图阻止查询优化器阻止读取,直到它使用选项使用计划 XML 等重新编译或更新统计信息。但我遇到了编译错误,抱怨查询计划 XML 无效;这可能是真的,因为查询是安静的:涉及本地表变量的选择 + 连接。我有点破解了 XML,也许这就是它认为它无效的原因。所以我放弃了使用计划提示。
我们尝试了定期(每 15 分钟)手动运行更新统计信息,以尽可能使统计信息保持最新,但这会损害性能。 updatestats 阻止写入,我敢肯定甚至读取; updatestats 似乎维护了一堆统计数据,平均需要大约 80-90 秒。等待这么长时间的读取是不可接受的。
所以想法是让读取发生并防止重新编译/更新统计数据阻止它的情况,对吗?完全禁用自动统计是否有意义?或者在删除所有自动创建的统计信息后禁用自动创建统计信息?
这可能违反了 Microsoft 的建议,因为它们默认启用自动创建统计信息和自动更新统计信息,并且性能可能会受到影响,但您可以提供任何想法/提示将不胜感激。
【问题讨论】:
-
您提到“手动更新统计信息”,通过
sp_updatestats?还是使用其他方法? -
您是否检查过您的缓冲区缓存命中率或检查您的内存是否过于紧张?
-
架构的结构如何?大多数表都使用代理键吗?如果是这样,他们的类型是什么?即,大多数表是否使用标识列?指导?自然键?这些表有多大?
-
我不明白你在说什么问题是什么?您是说重新编译需要时间吗?那么“糟糕的 SQL 读取性能”是什么意思呢?读取次数高?或者它们需要很长时间,因为它们被阻止或需要从光盘中读取?
-
@sOltan - Guid 作为键需要特别注意。您无法使用
newid生成您的 guid,否则读取性能将非常糟糕。您必须使用等效的 NewSeqentialGuid 或 COMB guid,它将部分 guid 替换为日期时间。这可能是您的性能问题的根源。
标签: sql-server performance tsql