パラメータ化されたテーブル値関数を持つ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行または数行しか返しません。 - テーブル値関数は非常に時間がかかり、多くの 行を呼び出すと、選択時間が非常に長くなります。
私の問題は:すべての行が関係なく、ただANOTHER_TABLE
に参加するとき、データが制限されるという事実のLOT_OF_ROWS_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 ...
私が知りたいのです:
は、任意の設定はありますかヒントか、最終的に制限された行に対してのみselect関数が関数を呼び出すようにしますか?
ありがとうございます。
EDIT:
テーブル値関数は非常に複雑です:http://pastebin.com/w6azRvxR。 私たちが話しているセレクトは「ユーザー設定」で、生成されたものはhttp://pastebin.com/bFbanY2nです。
明白なことを明記してください:クエリテキスト内の結合の順序を変更できるのはあなただけです。その後、FORCE_ORDERクエリヒントを使用できました。コードはどのように生成されますか?その目的のために行動を変える方法はありませんか? –
'dbo.HeavyTableValuedFunction(..)'の複数行のテーブル値関数をインラインテーブル値関数に変更します。 – RBarryYoung
@RBarryYoung:単純すぎてインライン関数に書き直すには複雑すぎる –