web-dev-qa-db-ja.com

更新列がインデックスにない更新ステートメントに対するインデックスの影響

インデックスがupdatedeleteおよびinsertをスローダウンさせると人々が言うのを常に見ています。これは、あたかも絶対的なものであるかのように、包括的なステートメントとして使用されます。

データベースをチューニングしてパフォーマンスを向上させている間、私はこのルールに論理的に矛盾しているように見えるこの状況に遭遇し続け、他の方法で誰かが発言したり説明したりする場所はどこにもありません。

SQL Serverでは、他のほとんどのDBMSを使用していると思いますが、指定した特定の列に基づいてインデックスが作成されます。挿入と削除は常に行全体に影響するため、インデックスに影響を与えない方法はありませんが、更新は少しユニークに見え、特定の列にのみ影響を与える可能性があります。

インデックスに含まれていない列があり、それらを更新した場合、そのテーブルの他の列にインデックスがあるからといって遅くなりますか?

例として、Userテーブルに、1つまたは2つのインデックス、Identity/Auto Increment列である主キー、および一部の外部キー列での別の主キーがあるとします。
電話番号や住所など、インデックスのない列を直接更新した場合、どちらの状況でも他の列にこのテーブルのインデックスがあるため、更新が遅くなりますか?私が更新している列はインデックスにないので、論理的には、インデックスは更新されるべきではありませんか?どちらかといえば、WHERE句でインデックスを使用すると、処理が高速になると思います。

17
Ryan

インデックス付けされていない列を更新してもインデックスは変更されないのは正しいことです。単純なケースでは、テーブルへの全体的な影響もありません。

クエリがインデックスを使用してデータを検索できる場合、may検索が高速化されますが、正確な動作(SQLブランドによって異なります)が異なる場合がありますSQLの他のブランドから。 (主にMicrosoft SQL Serverを使用しています。)

もちろん、非常に大量のデータで列を更新すると、行が別のページに移動するなどの原因になる可能性があります。

6
RLF

比較的高速な最新システムの場合、OLTPテーブルに単一のインデックスを追加しても、パフォーマンスの観点からは事実上検出できませんシステムの大多数の場合。 、不要なインデックスを作成しないでください。また、テーブルのすべての列に単一列のインデックスを作成しないでください。

多くのクエリで有用なインデックスが存在すると、速度が大幅に向上するという前提で正しいです。

あなたの質問はパフォーマンスに関するもののようですが、インデックスの追加に関して他にもいくつかの潜在的な問題があります。

  1. インデックスの作成に必要な時間は、インデックスがテーブルに追加されている間、ブロックされる可能性があります。ロックの有効期間は非常に短いため、大きな問題が発生することはほとんどありません。

  2. インデックスを変更すると、基になるテーブルを参照するプランの実行プランが無効になります。これらの実行プランを再コンパイルすると、一部のクエリのパフォーマンスが低下する可能性があります。

  3. インデックスの変更により、以前に何も返されなかったクエリがエラーを返す場合があります。 varcharフィールドに含まれる日付を返すために使用されたフィルターされたインデックスの場合を考えてみましょう。フィルターが日付ではない行を排除し、その後そのフィルターが変更された場合、日付以外のデータを変換しようとすると、そのインデックスに依存していたクエリが失敗する可能性があります。

  4. 新しいインデックスにより、実行順序が変更され、以前に発生しなかった場所でデッドロックが発生する可能性があります。

10
Max Vernon