2017-06-15 6 views
0

質問:コードをカプセル化し再利用するためにインラインテーブル値関数(ITVF)を使用できますか?それともパフォーマンスの問題につながるでしょうか?SQLコードをカプセル化するインラインテーブル値関数を使用したパフォーマンス

私はこの議論に私を導いた、インラインテーブル値関数、研究していた:議論で答えは、インラインテーブル値関数は、「オプティマイザは何も違ったオブジェクトよりも、これらの機能を処理しないことを可能にすると述べている When would you use a table-valued function?

を彼らは最適なパフォーマンスを提供します(あなたのインデックスと統計情報が理想的だと仮定して)。

私の元々の問題は、さまざまなデータソースを標準形式に再フォーマットし、それらを結合しようとしていたことでした。私は6つの異なるITVFとunionと変換を1つのクエリーで実行することをテストしました。実行計画は同一でした。

私の背景がoopになっているので、クエリをより小さな関数に分割することをお勧めしますが、今後のプロジェクト全体でこれを行う前に、あまりにも多くのITVFを使用すると最終的にパフォーマンスの問題が発生するかどうかは疑問でした。

+0

"RETURNS TABLE"を追加すると、関数がインラインになるという誤った考えに陥ることはありません。それはただ一つのステートメントでなければなりません。変数や複数のコード行がある場合、パフォーマンスは恐ろしいものになります...スカラー関数よりもさらに悪いです。 –

+0

@SeanLange単一のステートメントとは何ですか?ユニオン、クロス適用、サブクエリは1つまたは複数のステートメントと見なされますか? –

+0

これはすべて単一のステートメントになります。 begin/endブロックを配置する必要がある場合、インライン関数はありません。関数の定義が "... AS RETURN ..."の場合は、適切な形になっています。 :) –

答えて

0

コードをカプセル化して再利用するためにインラインテーブル値関数(ITVF)を使用できますか?

はい。また、マルチステートメントTVFの場合、カプセル化によって、クエリオプティマイザが述語をTVFロジックにプッシュすることが防止され、返される行数を正確に見積もることができなくなるため、マルチステートメントTVFよりも優れています。

これがパフォーマンス上の問題につながりますか?

短い回答ですが、通常はそうではありません。

長い答え:

クエリロジック(全体のクエリだけでなく、スカラー式)をカプセル化して再利用する4つの方法があります。

  1. ビュー
  2. インライン表値関数
  3. 複数ステートメントのテーブル値関数
  4. 一時表
  5. テーブル変数

ビューと本質的にパフォーマンスが低下することはありませんインラインTVFS、クエリの最適化の複雑さが増します。

オプティマイザが安価なプランを見つけられない場合は、介入する必要があります。あなたができる一般的な方法は、インラインTVFを複数ステートメントのTVFに置き換えるか、結果を一時的なテーブルにスプールするなど、中間結果のスプール(つまりマテリアライズ)を強制することです。

スプーリングは、より大きなクエリのコンテキストで実行されたカプセル化されたクエリを最適化する可能性があるため、カプセル化クエリの複雑さを軽減します。

結果をスプールするときには、通常、一時テーブルがSQL Serverとして最も優れています。中間テーブルを使用するプランのコストをSQL Serverが正確に評価するためのインデックスと統計情報があります。

0

ITVFは、クエリロジックをカプセル化して再利用するのに最適です。私は十数件の財務報告をしており、すべて同じ情報を同じテーブルに照会し、そのデータを提供する関数を作成することで、すべてのレポートが同じデータ本体から取り出されていることを確認できます。 ITVFの代わりに簡単にビューを作成することもできますが、ITVFは送信されたパラメータに基づいてデータをフィルタリングしたり変換したりする方法も提供します。たとえば、私の財務機能は、オプションの入力パラメータとして地区名を受け入れ、その地区のデータのみを返すことができます。このようにITVFを使用することで、オプティマイザは、送信されたパラメータに基づいてクエリプランを最適化することができます。これにより、パフォーマンスが低下するのではなく、役立ちます。

6つの異なるITVFのユニオンではなく、すべてのテーブルを1つのITVFにまとめることをお勧めします。つまり、テーブルスキーマやレポートの要求が変更された場合に更新する場所は1つだけです。

関連する問題