未使用のインデックスの削除-予期しない危険性の評価


16

7月にサーバーが最後に再起動されて以来蓄積されているDMV統計によると、数百の未使用のインデックスを持つ非常に大きなデータベースがあります。DBAの1人が次の警告文を作成しましたが、私には意味がありません。

  1. インデックスを削除する前に、クエリオプティマイザーがこのインデックスの存在を必要とする可能性があるため、一意性制約が適用されていないことを確認する必要があります。
  2. インデックスが作成されるたびに、そのインデックスに関連する統計もSQL Serverに作成されます。クエリはインデックスを使用していない可能性がありますが、統計を使用している可能性があります。そのため、インデックスを削除した後、特定のクエリパフォーマンスが非常に悪くなるという状況が発生する場合があります。SQL Serverは、統計の使用統計を保持しません。データベースで「統計の自動作成」機能を有効にしていますが、クエリオプティマイザーが不足している統計を作成する前に、すべてのパラメーターを内部で満たす必要があるかわかりません。

#1に関しては、SQL Serverは実際にインデックスのシークを行って、挿入/更新が行われる前に一意性を判断するため、インデックスは使用されていないようには見えません。

#2に関して、これは本当に可能ですか?

ちなみに、インデックスを使用しないという場合、シークもスキャンもありません。


3
年末レポートを実行してもそのインデックスが使用されないことが確実な場合は、インデックスを無効にすることをお勧めします。
キンシャー

回答:


17

DBAの懸念は両方とも有効です。

#1に関しては、SQL Serverは実際にインデックスのシークを行って、挿入/更新が行われる前に一意性を判断するため、インデックスは使用されていないようには見えません。

オプティマイザーは、一意性の保証を使用して、正しい結果を得るために使用できる論理変換または物理操作を決定できます。オプティマイザーが一意性の保証に依存しているという事実は、たとえば、集計の変換や1対多のマージ結合の選択など、最終的な実行プランでインデックスに物理的にアクセスしない限り、インデックスの使用統計に反映されません。 。したがって、一意のインデックスまたは制約を削除(または無効化)する場合は、十分に注意する必要があります。

#2に関して、これは本当に可能ですか?

はい。オプティマイザは、インデックスを使用したアクセスを特徴とする最終的な実行プランなしで、インデックスに関連付けられた統計を使用できます。「興味深い」統計をロードし、カーディナリティの推定値を計算し、完成した実行計画を作成するプロセスは、非常に独立したアクティビティです。

インデックスを削除すると、関連付けられたインデックス統計も削除され、次回ステートメントが再コンパイルされるときにプランの品質に影響する可能性があります。インデックス統計は、インデックスが物理的に最終計画に存在しない場合でも、最終計画が依存するカーディナリティ推定計算で使用できます。

あなたのDBAは彼/彼女のものを知っています。

これは、明らかに使用されていないインデックスを削除しないことを意味するものではありません。DBAの懸念は有効なものであり、それに応じて、適切なテストと復旧計画とともに、変更を計画する必要があると言っています。私の経験では、ポイント#1は#2よりも問題がある可能性が高いですが、それがあなたの状況に当てはまるかどうかを知る方法はありません。

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