断片化に基づいてインデックスを再構築および再編成するために毎晩実行されるスクリプトを作成しました。断片化が30%を超えるインデックスは再構築され、断片化が10%-30%のインデックスは再編成されます。
スクリプトを実行した後、10%を超える断片化カウントを反映している約400のインデックスがあることに気付きました。さらに調査したところ、ページ数が1000未満のインデックスはSQLによって再編成されないという投稿に出くわしました。
スクリプトがすべてのインデックスを更新しなかった理由をさらに調査したところ、クエリの結果が
sys.dm_db_index_physical_stats(DB_ID(DB_NAME()),NULL,NULL,NULL, 'DETAILED')
1ミルを超えるレコードが含まれているテーブルのページカウント5、6を表示します。record_count列には約16 000レコードがあり、次のコマンドを実行してインデックスを強制的に再構築しました。
ALTER INDEX [indexname] ON [schema].[table] REBUILD WITH (FILLFACTOR = 85, STATISTICS_NORECOMPUTE = OFF)
そして、私のインデックスは1ミル+レコード数を示しています。
私の質問です:インデックスを再編成すると、インデックスのレコード数と断片化が修正されないのはなぜですか?そもそもこのレコード数の値がインデックスで古くなっているのはなぜですか?
今の私の計画は、今夜すべてのインデックスを強制的に再構築してから、通常どおりスクリプトを実行することです。インデックスレコード数が古くなるのを心配する必要がありますか?
あなたの答えをありがとう、私はそこからスクリプトを使用してしまいました
私のスクリプトが対応していないものであったに違いありません。 xml列はすべて正常に機能しています。
インデックスを再編成しても、インデックスの統計は更新されません。 SQL Serverは操作中にツリーの自動分散を行わないため、再編成によりB +ツリーの分散が保証されます。インデックスを再構築すると、インデックスが再作成され、エンジンがインデックスの統計を更新できるようになります。
メンテナンス時間を節約できると認められた、断片化が少ないクエリの統計を定期的に再編成および更新することを検討する必要があります。データが十分に均質である場合は、サンプルを使用して定期的に統計を更新することもできます。
統計の更新について詳しくは、こちらをご覧ください。
http://msdn.Microsoft.com/en-us/library/ms187348.aspx
Kimberly Trippのブログ http://sqlskills.com のインデックスメンテナンスについて
統計とインデックスのリンクを確認してください。
インデックスや統計が最新でない場合があり、SQL再インデックスジョブはインデックスが断片化されているかどうかを判断できません。
ランニング DBCC UPDATEUSAGE
事前に、インデックスが断片化レベルに従って再作成または再編成されることを確実にします。