SQL Server のクエリ実行時に取得することができる実行プラン (実行計画) の中には、「コスト」という情報が出力されています。
代表的な項目としては、サブツリーの推定コストや、グラフィカルな実行プラン内のコストのコストの比率の情報となるのではないでしょうか?
本投稿では実行プラン内のコストがどのような情報を表しているものなのかの情報を確認していきたいと思います。
本投稿を書いた理由ですが「Nick’s Machine」という用語を思い出すためだったりしますが。
Contents
docs 内の記述
最初に docs 内のコストについての記述を確認してみます。
コストについては、次のドキュメントに記載がありました。
いくつかの記述がありますが cost threshold for parallelism サーバー構成オプションの構成 の次の記述がコストの説明として、最初に把握しておく必要があるものではないでしょうか。
コストとは、予想時間の単位ではなく、抽象化されたコストの単位を表します。 cost threshold for parallelism は、SMP (symmetric multiprocessor) 環境でのみ設定します。
コストは処理の予測時間を表す単位ではなく、処理に対しての「抽象化されたコストの単位」を表す情報であるという記述が行われています。
コストが高い=クエリの内の処理の負荷が高いという判断はできますが、抽象化された値となるため、コストの値から「どの程度のリソースを使用しているか」や、「処理時間がどの程度かかっているか」というような判断をすることは行うことはできません。
また、コスト値は、推定実行プランから算出されているため、統計情報のデータ分布をベースとした、「推定コスト」となるため、実際の処理コストとは異なるということも意識しておく必要があります。(実際の処理で操作されるデータを意識し、表示されているコストに囚われすぎないことが重要)
docs 以外の記述
コストについてですが、docs 以外の記述にかなり詳細なものが記載されています。
- Incorrect data in Execution Plan?
- What’s an Estimated Subtree Cost?
- What is the “cost” in Cost Threshold for Parallelism?
サブツリーコストのベースとなっていた値についてもこれらの記事の中で言及されているものがあります。
サブツリーコストは SQL Server 7.0 の時代には、特定のハードウェア構成でクエリを実行する際に必要となる秒数を意味していました。
この際のハードウェア構成ですが、Microsoft のクエリ処理チームのニックさんの、Nick’s Machine と呼ばれる環境での測定となっていました。
以前は、http://blogs.microsoft.co.il/blogs/dannyr/archive/2008/10/09/what-estimated-subtree-cost-1-means-or-a-great-sql-server-history-story.aspx で記事が公開されていましたが、MS のブログの移転に伴い、元となった記事にはアクセスすることはできないのですが、当時の記事のキャプチャで Nick’s Machine を確認することはできるようです。
— Dave Dustin (@venzann) April 3, 2017
当初は、コスト値は処理時間として利用することができていました。
しかし、実際の処理時間はハードウェアやデータサイズにも依存し、SQL Server 7.0 の時代と比較して、ハードウェアの構成も大幅に変わってきています。
そのため、現在では、コスト値はコスト単位としての利用となっており、それ以外の用途では、利用すべきではないという値となっています。(例 : 環境 A と環境 B での処理性能の比較というような観点では利用しない)
最後に
コストから具体的な処理時間 / リソース消費を算出することはできずハードウェアの構成によってもコスト値は変わってきますので、複数の環境で比較するための値として活用することはできません。
しかし、コスト値はクエリ内で処理負荷がかかっている個所を検討するために活用できる値ですので、値の意味を把握して活用を行うことが重要ではないでしょうか。
[…] https://blog.engineer-memo.com/2021/03/21/sql-server-%e3%81%ae%e3%82%af%e3%82%a8%e3%83%aa%e5%ae%9f%e… […]
【後で読みたい!】SQL Server のクエリ実行プランのコスト値について | Tak's Bar
22 3月 21 at 22:06