1
  1. 別のビューとインデックスのないmyviewテーブルに基づいたビューから選択したところ、クエリは40分間実行されましたmytable
  2. 5つのインデックスを追加しmytableて再myview実行すると、クエリが3分間実行されました
  3. 私はこのようにmytableのコピーを作成しました:

    mytableからmytableNEWに*を選択します

  4. インデックスがコピーされていないことに注意してください。
  5. 私はmyview(新しいテーブルを指すのを忘れずに)再実行しました、そしてそれは3分かかりました!!

質問:クエリが最初にインデックスなしで40分かかったのに、テーブルにインデックスを作成し、データ(インデックスなし)を別のテーブルにコピーした後、クエリが非常に高速化したのはなぜですか?

4

1 に答える 1

1

私の推測(コメントには長すぎます)は、ビューの最適ではないクエリプランです。

ビューのクエリプランは、現在の実行ではなく、ビューが最初に実行されたときに基づいています。時間の経過とともに、テーブルが変更され、環境が変更されましたが、ビューは引き続き元のクエリプランを使用していました。ネストされたループ結合を実行していたと思われます。実行エンジンは、クエリを再コンパイルしなくても、インデックスを動的に検索して使用できるほど賢いです。

ビューを新しいテーブルに再ポイントすると、ビューは現在の環境用に再コンパイルされたため、実行プランが最適でした。

これは推測です。データが本当に本当に大きい場合を除いて、キャッシュミスによる40分の差は非常に大きいようです。

于 2012-12-26T22:38:18.177 に答える