【发布时间】: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 发邮件直接问她?