ページ数が1000未満のインデックスを再構築しませんか?


17

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は15インデックスで70%を超え、28インデックスで30%を超えていました。

そこで、オラ・ハレングレンのソリューションを使用してすべてのインデックスを再構築します。クエリを再度実行したとき、これが結果でした:

12のインデックスで70%を超える断片化、15のインデックスで30%を超える断片化。

その理由は、page_countまだ非常に断片化されている各インデックスの1000未満であるためだと考えました。たとえばpage_count 、967のインデックスの1 つには98,98%の断片化率があります!私には、そのインデックスを再構築する価値があるようです!しましたが、その後、断片化は0%でした。また、インデックスpage_countが132の場合、95%から0%になりました

だから、私の質問は、これらのインデックスを再構築しない理由は何ですか?理由の1つは、再構築に時間とリソースがかかることかもしれませんが、インデックスが小さいため、リソースのコストが比較的少なく、それでも再構築するのに有益であるということではありませんか?

このサイトには複数の関連する質問がありますが、それらはすべて、インデックスが最適化されない理由、またはインデックスが小さくても最適化されない場合にインデックスが依然として有用であるという質問に答えますが、ここでステートメントは断片化を減らします問題は、とにかくやってみませんか?


小さなインデックスは、メモリにキャッシュされる可能性があります。とにかくIOが発生しないインデックスは、最適化の恩恵を受けません。この1000ページカウントルールはヒューリスティックです。
usr

回答:


20

最小ページ数に関するガイダンスは、いくぶんarbitrary意的です。断片化を減らす最大の利点は次のとおりです。

  1. 大規模なスキャンの先読みパフォーマンスを改善できます。そして
  2. ページ密度(ページあたりの行数)が向上する場合があります

これらの要因は両方とも、定義により、小さなインデックスにとってそれほど重要ではありません。

小さなインデックスの再構築に対する反論は、基本的に次のとおりです。

「なぜわざわざ心配する必要がありますか?」

ただし、再構築/再編成は無料ではありません。場合によっては、余分な労力とログ生成を回避する価値があるかもしれません(たとえば、ミラーリング、可用性グループ、レプリケーションなど、考えられるさまざまな理由でログがWANを介して出荷/コピーされる場合)。また、オンラインで再構築する場合を除き(または場合によっては)、再構築はロックを通じて他の同時プロセスに影響を与える可能性があります。最後に、小さなインデックスの場合、混合エクステントからの割り当てが原因で、再構築しても断片化が減少しない場合があります(トレースフラグ1118を有効にして実行している場合を除く)。

それでもこれらの小さなインデックスを再構築する方が幸せであり、その結果を気にしない場合は、必ず@PageCountLevelOlaのプロシージャに渡されるパラメータの値を変更してください。

詳細については、Paul RandalのIndex Fragmentationに関するプレゼンテーションPASSテレビ録画を参照してください。

また、SQL Serverでインデックスフラグメンテーションが重要ではない理由についてブレントオザールが語るのをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.