【问题标题】:Why is SQL Server 2008 index maintenance run only for indexes with index_level set to 0?为什么 SQL Server 2008 索引维护只对 index_level 设置为 0 的索引运行?
【发布时间】:2012-02-10 08:12:35
【问题描述】:

我一直在使用来自sqlfool.com 的索引碎片整理脚本用于我修改的 SQL 服务器,以便在我们的夜间维护程序中工作。该脚本是一项正在进行的工作,当发现错误或可以添加改进时会对其进行修改。我喜欢这个脚本的地方是有很多人在使用它,并且对它进行了很多思考。

最新版本可以在这里找到http://sqlfool.com/大约在页面的一半。

脚本的一部分我不确定,并试图追踪它的一些信息,但似乎无法得到关于为什么这样做的确切答案。

以下是脚本的一部分,用于决定应该考虑重建或重组哪些索引。我还包括了传递给与插入中做出的决定相关的过程的参数。

@minFragmentation       FLOAT               = 10.0  
    /* in percent, will not defrag if fragmentation less than specified */

, @minPageCount           INT                 = 8 
    /*  MS recommends > 1 extent (8 pages) */

, @scanMode               VARCHAR(10)         = N'LIMITED'
    /* Options are LIMITED, SAMPLED, and DETAILED */

INSERT INTO dbo.dba_indexDefragStatus
(
      databaseID
    , databaseName
    , objectID
    , indexID
    , partitionNumber
    , fragmentation
    , page_count
    , range_scan_count
    , scanDate
)
SELECT
      ps.database_id AS 'databaseID'
    , QUOTENAME(DB_NAME(ps.database_id)) AS 'databaseName'
    , ps.[object_id] AS 'objectID'
    , ps.index_id AS 'indexID'
    , ps.partition_number AS 'partitionNumber'
    , SUM(ps.avg_fragmentation_in_percent) AS 'fragmentation'
    , SUM(ps.page_count) AS 'page_count'
    , os.range_scan_count
    , GETDATE() AS 'scanDate'
FROM sys.dm_db_index_physical_stats(@databaseID, OBJECT_ID(@tableName), NULL , NULL, @scanMode) AS ps
JOIN sys.dm_db_index_operational_stats(@databaseID, OBJECT_ID(@tableName), NULL , NULL) AS os
    ON ps.database_id = os.database_id
    AND ps.[object_id] = os.[object_id]
    AND ps.index_id = os.index_id
    AND ps.partition_number = os.partition_number
WHERE avg_fragmentation_in_percent >= @minFragmentation 
    AND ps.index_id > 0 -- ignore heaps
    AND ps.page_count > @minPageCount 
    AND ps.index_level = 0 -- leaf-level nodes only, supports @scanMode
GROUP BY ps.database_id 
    , QUOTENAME(DB_NAME(ps.database_id)) 
    , ps.[object_id]
    , ps.index_id 
    , ps.partition_number 
    , os.range_scan_count
OPTION (MAXDOP 2);

我想知道的是为什么 where 子句下面的过滤器是什么?

AND ps.index_level = 0 -- leaf-level nodes only, supports @scanMode

以下是其中一个索引的结果,它显示索引级别 1 的平均碎片率为 99%。

【问题讨论】:

  • 你为什么不直接给 Michelle Ufford @sqlfool.com 发邮件直接问她?

标签: sql-server-2008 indexing


【解决方案1】:

在您的参考图片中,index_level 1 和 index_level 2 的页数低于 1,000。

由于这些索引级别的页面很少,碎片百分比与性能无关,减少它们将是表面上的影响。

参考资料:

http://technet.microsoft.com/en-us/library/cc966523.aspx

通常,您不应该担心少于 1,000 页的索引的碎片级别。在测试中,包含超过 10,000 页的索引实现了性能提升,其中页数显着增加(大于 50,000 页)的索引的性能提升最大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多