この実行計画を見てみましょう: http://sdrv.ms/1agLg7K
これは推定ではなく、実際のものです。約30 分かかった実際の実行から。
2 番目のステートメントを選択します (合計実行時間の 47.8%、約 15 分かかります)。
そのステートメントの一番上の操作を見てください – View Clustered Index Seek over _Security_Tuple4. 操作のコストはステートメントの 51.2% (約 7 分) です。
ビューには約 0.5M 行が含まれています (参考までに、log2(0.5M) ~= 19 – インデックス ツリー ノードのサイズが 2 であることを考えると、わずか 19 ステップであり、実際にはおそらくそれ以上です)。
その演算子の結果はゼロ行です (見積もりとは一致しませんが、今のところ気にしないでください)。
実際の実行 – ゼロ。
問題は、ビープ音が 7 分もかかるのはなぜでしょうか?! (そしてもちろん、どうすれば修正できますか?)
編集:私がここで求めていることについての明確化。「インデックスを調べる」、「サイズを調べる」、「パラメータ スニッフィング」、「異なるデータに対して異なる実行プランを実行する」など、一般的なパフォーマンス関連のアドバイスには興味
がありませ
ん。そのような分析はすべて自分で行います。
私が本当に必要としているのは、ある特定のクラスタ化インデックスのシークが非常に遅くなる原因と、それを高速化するために何ができるかを知ることです。
クエリ全体ではありません。クエリの一部ではあり
ません。
その 1 つの特定のインデックス シークだけです。
編集終了
また、2 番目と 3 番目にコストのかかる操作が、それぞれ _Security_Tuple3 と _Security_Tuple2 に対するシークであり、時間の 7.5% と 3.7% しかかからないことに注意してください。一方、_Security_Tuple3 には約 280 万行が含まれており、これは _Security_Tuple4 の 6 倍です。
また、いくつかの背景:
- これは、このプロジェクトで不正な動作をする唯一のデータベースです。同じスキーマのデータベースが他にも数十ありますが、この問題が発生するデータベースはありません。
- この問題が初めて発見されたとき、インデックスが 99% 断片化されていることが判明しました。インデックスを再構築すると速度は向上しましたが、それほど大きくはありませんでした。クエリ全体で、再構築前に 45 分、再構築後に 30 分かかりました。
- データベースをいじっていると、「select count(*) from _Security_Tuple4」のような単純なクエリに数分かかることに気付きました。なんてこと?!
- ただし、最初の実行では数分しかかからず、その後はすぐに実行されました。
- 問題は特定のサーバーや特定の SQL Server インスタンスに関係していません。データベースをバックアップしてから別のコンピューターに復元しても、動作は変わりません。