gar*_*rik 4 performance index sql-server-2008 statistics
我正在优化一些使用数据库的服务器应用程序任务(查询、复杂计算、数据插入......)。执行此任务大约需要 16 分钟(我已经测试了 3 次以上),并且执行时间是可预测的。
然后我执行了脚本:
ALTER INDEX ALL ON dbo.'+ @TableName +' REBUILD
Run Code Online (Sandbox Code Playgroud)
对于数据库中的每个表。还有我现在看到的。我的任务的执行时间增加到 24 分钟。如果这些对这项任务没有任何外部影响,会发生什么?我正在等待性能提高(由于重建碎片索引)但性能下降。
这是因为当您重建索引时,您也必须在每个索引发生时重建统计信息。这意味着 SQL Server 会重建有关索引中数据分布的内部数据“表”。您的统计信息所指示的数据分布决定了基于成本的查询优化器如何选择为您的查询创建计划。
从本质上讲,这意味着 SQL Server 可能使用与以前不同的计划来执行您的查询,因为您的数据分布发生了变化。
对此没有简单的解决方法。它涉及真正的侦探工作。从 SQL Server Profiler 开始,了解此作业中实际运行的查询。详细分析每个查询计划并找出查询的哪些部分占用的时间最多,并相应地调整您的查询、索引方案甚至架构。
除了查询计划更改之外,您还可能会看到由于在索引重建之前未发生的页面拆分而导致的插入性能不佳。可能值得研究填充因子。
基本上我建议调查任务的哪一部分是缓慢的,这应该提供一些线索。