3

次のようなクエリがあります。

SELECT someString  FROM
(
    SELECT someString FROM someTable
    WHERE someField = 1
) X
WHERE dbo.fnMyClrScalarFunction(X.someString) = 0

問題は、クエリ オプティマイザーが UDF をサブクエリ内に移動し、かなり制限的な 'someField = 1' 条件の前に適用されることです。残念ながら、UDF は正確には高速ではなく、パフォーマンスが大幅に低下します。これを防ぐ方法はありますか(一時テーブルを使用する以外に)、またはUDFが高価であることをSQLサーバーに確立する方法はありますか?

前もって感謝します

4

2 に答える 2

2

「かなり制限的な 'someField = 1' 条件」

その列にインデックスがありますか。SQL は、スカラー関数を適用した方が高速であると判断した場合にのみ、スカラー関数を適用する必要があります。最初の列が「someField」であるインデックスがある場合は、このテーブルの統計が最新であることを確認することをお勧めします。

于 2010-11-10T18:53:44.637 に答える
0

1 つの方法は、一時テーブルまたはテーブル変数を使用することです。

declare @t table (SomeString varchar(100))
insert @t select someString from someTable where someField = 1
select someString from @t where  dbo.fnMyClrScalarFunction(someString) = 0

一時的にそれらよりも高価に見えます。実際、ほとんどの結合は一時的なヘルパー テーブルを使用して実行されます:)

于 2010-11-10T19:28:37.557 に答える