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