私はOla Hallengrensスクリプトをインデックスのメンテナンスに使用しています。その前に、次のクエリを使用して、どのインデックスが最も断片化されているかを確認しました。
SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
ORDER BY indexstats.avg_fragmentation_in_percent desc
私の場合、avg_fragmentationは70%15インデックスでは%28インデックスでした。
したがって、私はOla Hallengrenのソリューションを使用してすべてのインデックスを再構築します。もう一度クエリを実行すると、次のような結果になりました。
12インデックスの場合は70%、15インデックスの場合は%以上の断片化。
理由はpage_count
が原因であり、非常に断片化された各インデックスの1000未満でした。たとえば、page_count
が967のインデックスの1つには、断片化率98,98%!があります。私には、そのインデックスを再構築する価値があるようです。私はそうし、その後、断片化は%でした。また、page_count
が132のインデックスは95%から%に変更されました
それで、私の質問は、これらのインデックスを再構築しない理由は何ですか? 1つの理由は、再構築に時間とリソースがかかるということかもしれませんが、インデックスが小さいため、リソースのコストが比較的少なくて、それでも再構築することが有益であるということではありませんか?
このサイトには複数の関連する質問がありますが、それらすべてが、インデックスが最適化されない理由、またはインデックスが小さくても最適化しない場合にインデックスが依然として有用であるかどうかの質問に答えますが、ここでステートメントは断片化を減らします。問題は、とにかくそれをしないのですか?
最小ページ数に関するガイダンスは やや任意 です。断片化を減らすことの最大の利点は次のとおりです。
これらの要素はどちらも、定義上、小さなインデックスにとってそれほど重要ではありません。
小さなインデックスの再構築に対する反論は、本質的には次のとおりです。
「なぜわざわざ?もっと重要なことを心配する必要はありませんか?」
とはいえ、再構築/再編成は無料ではありません。場合によっては、余分な労力とログの生成を回避する価値があるかもしれません(たとえば、ログがWANを介して出荷/コピーされた場合、考えられる理由-ミラーリング、可用性グループ、レプリケーション)。 ...)また、オンラインで再構築しない限り(または場合によっては)、再構築はロックによって他の同時プロセスに影響を与える可能性があります。最後に、小さなインデックスの場合、再構築によって、割り当てが原因で断片化が減少することすらありません。混合エクステントから( トレースフラグ1118 を有効にして実行している場合を除く)。
これらの小さなインデックスの再構築が依然として幸せであり、その結果を気にしない場合は、Olaのプロシージャに渡される@PageCountLevel
パラメータの値を必ず変更してください。
詳細については、 インデックスの断片化に関するPaul RandalのプレゼンテーションのPASS TV録画 を参照してください。
また、Brent Ozarが語っているのを見たいと思うかもしれません SQL Serverでインデックスの断片化が問題にならない理由