5

複雑なSQLステートメントをSQLServer2000のテーブル値関数でラップしました。SELECT*FROMdbo.NewFuncのクエリプランを見ると、作成したテーブルのテーブルスキャンが表示されます。

これは、テーブルがtempdbで作成されており、そこから選択しているためだと思います。

したがって、クエリは単純です:

SELECT * FROM table in tempdb

私の質問は次のとおりです。

UDFは複雑なSQLステートメントと同じプランを使用していますか?

このUDFのインデックスを調整するにはどうすればよいですか?

本当の計画が見えますか?

4

1 に答える 1

7

マルチステートメントテーブル値関数(TVF)は、外部クエリのオプティマイザーに対するブラックボックスです。プロファイラーからのみIO、CPUなどを確認できます。

TVFは、処理が行われる前に、完了するまで実行し、すべての行を返す必要があります。これは、たとえばwhere句が最適化されないことを意味します。

したがって、このTVFが100万行を返す場合、最初にソートされています。

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC

シングルステートメント/インラインTVFは、マクロのように展開されて評価されるため、影響を受けません。上記の例では、インデックスなどを評価します。

ここでも:クエリプランオプティマイザは、結合/フィルタリングされたテーブル値関数でうまく機能しますか?およびMicrosoftSQLServer2008でのJOINとAPPLYの相対効率

正確に答えるには:いいえ、いいえ、いいえ

マルチステートメントTVFはほとんどありません。ここでは、UDF内でフィルター処理するパラメーターがたくさんあります。

于 2009-09-16T11:28:43.427 に答える