2

この実行計画を見てみましょう: 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 倍です。

また、いくつかの背景:

  1. これは、このプロジェクトで不正な動作をする唯一のデータベースです。同じスキーマのデータベースが他にも数十ありますが、この問題が発生するデータベースはありません。
  2. この問題が初めて発見されたとき、インデックスが 99% 断片化されていることが判明しました。インデックスを再構築すると速度は向上しましたが、それほど大きくはありませんでした。クエリ全体で、再構築前に 45 分、再構築後に 30 分かかりました。
  3. データベースをいじっていると、「select count(*) from _Security_Tuple4」のような単純なクエリに数分かかることに気付きました。なんてこと?!
  4. ただし、最初の実行では数分しかかからず、その後はすぐに実行されました。
  5. 問題は特定のサーバーや特定の SQL Server インスタンスに関係していません。データベースをバックアップしてから別のコンピューターに復元しても、動作は変わりません。
4

3 に答える 3

3

最初に、ここで少し誤解を指摘したいと思います。delete ステートメントは実行全体の 48% 近くを占めると言われていますが、これは、必要な時間の 48% を要するという意味ではありません。実際、クエリ プランのその部分に割り当てられた 51% は、操作全体の「半分の時間」を占めていると解釈されるべきではありません。

とにかく、「初めて」テーブルの COUNT(*) を実行するのに数分かかるというあなたの発言によれば、上記のテーブル/ビューに関連する IO の問題があると言う傾向があります。個人的に私はマテリアライズド ビューがあまり好きではないので、マテリアライズド ビューとそれらが内部でどのように動作するかを実際に経験したことはありませんが、通常、断片化が基盤となるストレージ システムに損害を与えていることをお勧めします。2 回目に高速に動作する理由は、キャッシュからページにアクセスする方が、ディスクからフェッチする場合よりもはるかに高速であるためです。(ビューに(最大)フィールドはありますか?)

とにかく、何がそんなに時間がかかっているのかを調べるには、現在のトリガーからこのコードを取り出し、挿入および削除されたテーブルを「偽造」してから、タイムスタンプを追加したり、 SQL Sentry Plan Explorer のようなプログラムを使用して、各部分に実際にかかる時間を確認します (プログラム内からスクリプトを実行すると、期間の列があります)。間違った部分を見ている可能性があります。経験上、コストと実際の実行時間は、私たちが考えているほど常に関連しているとは限りません。

于 2013-09-12T19:48:25.220 に答える