【发布时间】:2023-03-13 22:42:01
【问题描述】:
我是一个 BI 项目的新手,每周 7 天中有 6 天要通宵处理大数据。我注意到处理时间(以小时为单位)随着时间的推移而增加,我致力于尽可能地识别并尝试修复它。
我发现的其中一件事是索引碎片化程度很高。在我的研究中,我找到了一种获取以下报告的方法:
- 平均碎片从 5% 到 30% --> 这可以通过 REORGANIZE 索引修复
- 30% 或更高的平均碎片 --> 这可以通过 REBUILD 索引修复
报告代码如下:
SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
CASE
WHEN ps.avg_fragmentation_in_percent > 30 THEN 'REBUILD'
ELSE 'REORGANIZE'
END +
CASE
WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max))
ELSE ''
END
FROM sys.indexes AS ix
INNER JOIN sys.tables t ON (t.object_id = ix.object_id)
INNER JOIN sys.schemas s ON (t.schema_id = s.schema_id)
INNER JOIN ( SELECT object_id,
index_id,
avg_fragmentation_in_percent,
partition_number
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)
) ps ON (t.object_id = ps.object_id AND ix.index_id = ps.index_id)
INNER JOIN ( SELECT object_id,
index_id,
COUNT(DISTINCT partition_number) AS partition_count
FROM sys.partitions
GROUP BY object_id, index_id
) pc ON ( t.object_id = pc.object_id AND ix.index_id = pc.index_id)
WHERE ps.avg_fragmentation_in_percent > 10 AND
ix.name IS NOT NULL
本周初,我运行报告并获得了 32 个碎片索引:9 个到 REOGANIZE; 23 重建。我每天都执行纠正措施,得到一份新的报告,今天我得到了 26 个零散的索引: 8 个要重新组织; 18 重建。
问题:问题很明显。我不想继续进行纠正性维护,而只是预防并避免夜间产生的碎片。怎样才能避免索引碎片?有什么建议、建议、策略吗?
一般信息:
- 每个 FK 都有一个非聚集索引。
- 作为常见连接条件的一部分的有趣列(无 FK)具有关联的非聚集索引。
- Microsoft SQL Server 2005 - 9.00.5294.00 (X64)
提前致谢,
【问题讨论】:
标签: sql database indexing data-warehouse database-performance