web-dev-qa-db-ja.com

SQL Server:テーブル値関数とストアドプロシージャ

私は、実行計画と、ストアドプロシージャの動的パラメータの問題について多くのことを読んでいます。私はこれに対する提案された解決策を知っています。

しかし、私の質問は、SQL Serverがストアドプロシージャの実行プランをキャッシュすることを示したすべてのことです。テーブル値関数については言及されていません。私はそれが(興味のない)ビューに対してそうすることを仮定します。

テーブル値関数が呼び出されるたびに再コンパイルされますか?

ストアドプロシージャではなく、テーブル値関数を使用するのが最適な場合はいつですか。

30
IamIC

インラインテーブル値関数(TVF)はマクロのようなもので、外部クエリに展開されます。そのため、プランはありません。呼び出しSQLにはプランがあります。

マルチステートメントTVFには計画があります(参照が見つかります)。

TVFは、パラメーター化された入力のSELECTリストを変更する場合に便利です。インラインTVFが拡張され、オプティマイザーによって外側のselect/whereが考慮されます。マルチステートメントTVFの場合、完全に実行する必要があるため、最適化は実際には不可能ですthenフィルター。

個人的には、マルチステートメントTVFではなくストアドプロシージャを使用します。それらはより柔軟です(たとえば、ヒント、状態の変更、SET NOCOUNT ON、SET XACTABORTなど)。

インラインTVFには異論はありませんが、SETを使用して状態を変更することができないため、クライアント向けコードにそれらを使用する傾向はありません。

29
gbn

私はこれを確認していませんが、関数の実行プランもキャッシュされることは当然です。それができない理由がわかりません。

ただし、ビューの実行プランはキャッシュされません。ビュー内のクエリは、ビューを使用するクエリの一部になるため、ビューを使用するクエリではなく、ビュー自体では実行プランをキャッシュできます。

関数とストアドプロシージャのどちらを使用するかは、どのような結果が必要かによって異なります。テーブル値関数は単一の結果を返すことができますが、ストアドプロシージャは1つの結果、多くの結果を返すことも、まったく結果を返さないこともあります。

0
Guffa