web-dev-qa-db-ja.com

クエリコストを読み取るにはどうすればよいですか。

現在、SQL 70-433(マイクロソフト認定試験)の勉強をしており、「クエリコスト」のパフォーマンスメトリックについて非常に混乱しています。

Google経由で見つけたドキュメントによると、クエリコストはパーセンテージの数値であり、バッチの一部で占められているバッチ全体のパーセンテージを表しています。特定のクエリの絶対的なメリットではなく、その横に偶然現れる他のクエリと比較した場合のメリットに興味があるので、これはすでに少し奇妙に思えました。

しかし、私が思ったのは、おそらく、2つの代替クエリを並べて「バッチ」として実行し、コストが50%未満の方が勝者になる、ということです。

しかし、第6章のクエリコストの説明では、MicrosoftのSQL 70-433トレーニングキットの1つであるレッスンは、これとは関係がないようです。

次に例を示します。これらは2つの相関サブクエリを含むクエリを示し、サブクエリをOUTER APPLYに置き換えることでそれを改善しています。結果:「このクエリのコストは約76ですが、最初のクエリのコストは倍の151でした。」次に、クエリをさらに改善し、コストを76から3.6に削減します。これらの数値がパーセンテージであることを意味するのではなく、他のクエリを参照せずに、スタンドアロンオブジェクトとしてのクエリに関連する絶対的な数値であることを意味します。とにかく、最初のクエリのコストはどうやって151%になるのでしょうか。

この章の後半では、3つの部分からなる実行プランのスクリーンショットを示しています。最初は「コスト:0%」、2番目は「コスト:1%」、最後は「コスト:99%」と言いますが、スクリーンショットの下の(本自体の)テキスト「このクエリのコストは0.56です」 。他の種類のコストを意味していると思いますが、それを他の場所で参照することはできません。

誰か助けてもらえますか?私は完全に混乱しています。

34

クエリコストは、実行プランで「推定サブツリーコスト」として報告されます。これは、1.5などの絶対的な数値です。 SQLBitsプレゼンテーション で言及されているConor Cunninghamは、SQL Server 7の特定のMicrosoft従業員のマシン( "Nick's Machine" )で実行するのにかかった秒数を最初に参照していた日々

enter image description here

しかし、今は全体的なコストの単位のない測定値として解釈されるべきです。

実行計画はツリーです。ツリー内の各イテレーターには、推定CPUコストと推定IOコストが与えられ、これらが合計されて全体のコストが得られます(相対重み付けは 文書化されていないDBCCコマンド )。推定サブツリーコストには、イテレータ自体とそのすべての子孫のコストが含まれます。使用されるコスト計算式の例を確認するには、 この記事 を参照してください。

SSMSでクエリ全体の推定コストを決定するには、グラフィカルプランの左側にあるルートイテレータ(SELECTイテレータなど)を選択し、SSMSプロパティウィンドウでこのメトリックを確認します。

複数のクエリを実行する場合(同じバッチであるかどうかに関係なく)、これらの値をすべて合計し、期待どおりに割合を計算することで、割合が計算されます。

実際の実行計画であっても、このコストの数値は推定に基づいており、これを使用して2つの異なるクエリの相対的なメリットを比較することは、推定が不正確な場合には、まったく間違っている可能性があることに注意してください。

43
Martin Smith