【问题标题】:How to avoid Index Fragmentation in datawarehosue database?如何避免datawarehosue数据库中的索引碎片?
【发布时间】:2023-03-13 22:42:01
【问题描述】:

我是一个 BI 项目的新手,每周 7 天中有 6 天要通宵处理大数据。我注意到处理时间(以小时为单位)随着时间的推移而增加,我致力于尽可能地识别并尝试修复它。

我发现的其中一件事是索引碎片化程度很高。在我的研究中,我找到了一种获取以下报告的方法:

  1. 平均碎片从 5% 到 30% --> 这可以通过 REORGANIZE 索引修复
  2. 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


    【解决方案1】:

    导致索引碎片整理的原因有很多:

    • 更改连续索引字段的值
    • 乱序添加键
    • dba.stackexchange.com 可能是最好的来源

    根据我的经验,最糟糕的是第一个:更改索引列的值。

    您应该设置维护计划以每晚运行以重组索引。您可以使用 SSMS 执行此操作:

    您可以将其作为备份的一部分。它应该在您通宵处理后运行,以修复似乎导致的碎片整理。这是我在所有生产数据库中设置的。

    【讨论】:

    • 我正在尝试将其付诸实践。我创建了维护计划,在我感兴趣的表上创建了一个包含 Reorganize 和 Rebuild 索引的子计划并执行了它。但是,维护计划执行成功后,我运行之前发布的查询,报告的碎片索引仍然存在。任何线索可能是什么原因?
    • @G21 如果索引非常小(在这种情况下无关紧要)或者如果索引非常大并且没有足够的连续空间来排列索引页面,则有时不会进行碎片整理按顺序。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2011-04-09
    • 2013-03-28
    • 2017-10-08
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多