0

IDのリストを返す複雑なクエリを作成しました。次に、このクエリを再利用して、結果を別のクエリと結合します。そのために、これをストアドプロシージャまたはUDFに配置し、それを使用して一時テーブルに挿入する予定です。

以下のようなもの

1)クエリをストアドプロシージャに配置し、一時テーブルに挿入します

INSERT INTO #TEMP
EXEC SP_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

2)クエリをUDFに入れ、一時テーブルに挿入します

INSERT INTO #TEMP
SELECT ID_LIST FROM DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

1000 IDの結果で実行し​​た場合、2つの間の有意差はわかりません。しかし、実際の実装では、結果は100万行になる可能性があります。

パフォーマンスのためにどちらが良いでしょうか?

4

2 に答える 2

2

推測するのではなく、両方の手法の実行プランを比較することをお勧めします。

ユーザー定義関数は便利な場合があり、パフォーマンスを低下させる場合もあります。これらの問題は、セットベースの操作ではなく、カーソルと同様に行ごとの処理を使用することです。したがって、クエリの結果セットの場合、パフォーマンスへの影響はわずかです。ただし、結果セットが大きい場合は、パフォーマンスが問題になる可能性があります。一般的に、ユーザー定義関数を使用している場合は、大きな結果セットでそれらを使用することは避けたいと思うでしょう。代わりにストアドプロシージャを使用してください。

スカラー値のユーザー定義関数のパフォーマンスを向上させる1つの方法は、それらをテーブル値の関数に変換することです。

于 2009-10-03T09:52:27.537 に答える
0

インラインテーブル値関数を使用して直接結合する方が、質問で尋ねたオプションよりも優れた効率的なオプションであることがわかりました。何かのようなもの

SELECT MYTABLE.MYFIELD FROM MYTABLE, DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN) MYQUERY
WHERE MYTABLE.KEYVALUE = MYQUERY.KEYVALUE
于 2009-10-06T09:34:24.173 に答える