SQL Server 查询性能受重建未分段索引的影响

Jer*_*ray 1 sql-server

我在存储过程中有一个查询,当它通常以毫秒为单位运行时,相同的输入将定期超时(> 30 秒)。

该表有 2077748 行、59 列和 13 个索引。我们发现重建其中一个索引会使性能恢复到毫秒级。

这是有趣的部分。此索引每次重建时的碎片百分比小于 1%,上次为 0.01%。我一直在玩填充因子,因为我认为这可能是一个扩展问题,它是 100,然后是 80,现在是 60。这并没有影响这个问题的频率。

当我运行以下

select b.name,* 
from sys.dm_db_index_physical_stats(5,1075691080,NULL,NULL,NULL) a
JOIN sys.indexes b ON a.object_id = b.object_id AND a.index_id = b.index_id
Run Code Online (Sandbox Code Playgroud)

我得到

index_id partition_number index_type_desc alloc_unit_type_desc index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages page_count

66 1 非聚集索引 IN_ROW_DATA 3 0 0.01 1116 18.9229390681004 21118

关于其他地方的任何建议或此问题的来源?

小智 5

听起来索引的重建是一个红鲱鱼,特别是考虑到它是非集群的。重建更有可能使缓存中的错误查询计划无效,并且在重新运行时生成并再次使用好的查询计划。

在性能不好时捕获查询计划,然后在重建后比较它们,我怀疑您会看到不同的计划。

那将是我的第一步 - 例如,演示由于索引重建而对计划进行了哪些更改,或者证明计划没有更改。