質問:コードをカプセル化し再利用するためにインラインテーブル値関数(ITVF)を使用できますか?それともパフォーマンスの問題につながるでしょうか?SQLコードをカプセル化するインラインテーブル値関数を使用したパフォーマンス
私はこの議論に私を導いた、インラインテーブル値関数、研究していた:議論で答えは、インラインテーブル値関数は、「オプティマイザは何も違ったオブジェクトよりも、これらの機能を処理しないことを可能にすると述べている When would you use a table-valued function?
を彼らは最適なパフォーマンスを提供します(あなたのインデックスと統計情報が理想的だと仮定して)。
私の元々の問題は、さまざまなデータソースを標準形式に再フォーマットし、それらを結合しようとしていたことでした。私は6つの異なるITVFとunionと変換を1つのクエリーで実行することをテストしました。実行計画は同一でした。
私の背景がoopになっているので、クエリをより小さな関数に分割することをお勧めしますが、今後のプロジェクト全体でこれを行う前に、あまりにも多くのITVFを使用すると最終的にパフォーマンスの問題が発生するかどうかは疑問でした。
"RETURNS TABLE"を追加すると、関数がインラインになるという誤った考えに陥ることはありません。それはただ一つのステートメントでなければなりません。変数や複数のコード行がある場合、パフォーマンスは恐ろしいものになります...スカラー関数よりもさらに悪いです。 –
@SeanLange単一のステートメントとは何ですか?ユニオン、クロス適用、サブクエリは1つまたは複数のステートメントと見なされますか? –
これはすべて単一のステートメントになります。 begin/endブロックを配置する必要がある場合、インライン関数はありません。関数の定義が "... AS RETURN ..."の場合は、適切な形になっています。 :) –