【问题标题】:Reorganize index and level of defragmentation重组索引和碎片整理级别
【发布时间】:2012-09-13 11:14:05
【问题描述】:

我发现了这个问题here,但还没有答案:

如果索引碎片严重(超过 50%),alter index reorganize 会降低碎片级别吗?

【问题讨论】:

  • 是的,它会 - 但只是在一定程度上。这就是为什么根据经验,对于大于约 30% 的碎片,您应该重建索引 - 而不仅仅是重建索引。 Rebuild 还会更新对良好查询计划至关重要的统计信息。
  • @marc_s 我认为应该将此评论作为答案,因为它应得的。 (可能有人会先在谷歌中找到这个问题:))

标签: sql sql-server sql-server-2008 indexing reorganize


【解决方案1】:

是的,它会 - 但只是在一定程度上。索引重组仅围绕索引的叶级页面进行洗牌,并尝试压缩这些页面 - 但它不会完全重建索​​引结构。所以它可以消除一些碎片——但只能在有限的范围内。

这就是为什么根据经验,对于大于约 30% 的碎片(或者您可能想要选择不同的阈值,例如 25%,具体取决于您的情况),您应该重建索引 - 不仅仅是重新索引。 Rebuild 还会更新对良好查询计划至关重要的统计信息。

【讨论】:

    【解决方案2】:

    它是否会取决于碎片的性质。

    Reorganize 不会分配新页面,因此无法移除因非连续范围而发生的碎片。它通过交换页面来工作。即它确定属于叶级的第一个物理页面和叶级的第一个逻辑页面,如果它们不同,则交换内容。

    如果我尝试以下操作,我发现重组会将碎片从 99.9% 降低到 0.9%

    CREATE TABLE T( [ID] [int] IDENTITY NOT NULL,
                     [Filler] [char](8000) NULL,
                     PRIMARY KEY CLUSTERED ([ID] DESC))
    
    GO
    
    INSERT INTO T DEFAULT VALUES
    GO 1000
    
    SELECT object_name(object_id) AS name, 
           page_count, 
           avg_fragmentation_in_percent, 
           fragment_count, 
           avg_fragment_size_in_pages 
    FROM 
    sys.dm_db_index_physical_stats(db_id(), object_id('T'), 1, NULL, 'DETAILED') 
    WHERE  index_level = 0 
    
    
    SET STATISTICS IO ON;
    ALTER INDEX ALL ON T
    REORGANIZE ; 
    
    SELECT object_name(object_id) AS name, 
           page_count, 
           avg_fragmentation_in_percent, 
           fragment_count, 
           avg_fragment_size_in_pages 
    FROM 
    sys.dm_db_index_physical_stats(db_id(), object_id('T'), 1, NULL, 'DETAILED') 
    WHERE  index_level = 0 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 2014-07-18
      • 2019-02-25
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      相关资源
      最近更新 更多