CROSS APPLY
パラメータ化されたテーブル値関数に問題があります。単純化された疑似コードの例を次に示します。
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
CROSS APPLY dbo.HeavyTableValuedFunction(lor.ID) AS htvf
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
WHERE ...
- テーブルの内部選択
LOT_OF_ROWS_TABLE
が多くの行を返しています。 - テーブル
LOT_OF_ROWS_TABLE
を結合し、ANOTHER_TABLE
1 行または数行のみを返します。 - テーブル値関数は非常に時間がかかり、多くの行を呼び出すと、選択が非常に長く続きます。
私の問題:
この関数は、LOT_OF_ROWS_TABLE
join だけでデータが制限されるという事実に関係なく、返されるすべての行に対して呼び出されますANOTHER_TABLE
。
選択は示されている形式でなければなりません - それは生成されますが、実際にははるかに困難です。
書き直そうとすると、非常に高速になる可能性がありますが、次のように書き直すことはできません。
SELECT *
FROM (
SELECT lor.*
FROM LOT_OF_ROWS_TABLE lor
WHERE ...
) AS lor
INNER JOIN ANOTHER_TABLE AS at ON lor.ID = at.ID
CROSS APPLY dbo.HeavyTableValuedFunction(at.ID) AS htvf
WHERE ...
知りたい:
最終的に制限された行に対してのみ関数を呼び出すように選択を強制する設定やヒント、または何かがありますか?
ありがとうございました。
編集:
テーブル値関数は非常に複雑です: http://pastebin.com/w6azRvxR。私たちが話している選択は、「ユーザーが構成」して生成したものです: http://pastebin.com/bFbanY2n .