同じクエリ内の異なる入力変数に対して、同じテーブル関数を使用して数回結合したいと考えています。しかし、これは私の場合、テーブル変数を使用してテーブル関数から個別に選択するよりもはるかに遅いことがわかりました。
テーブル変数を回避しながら高速クエリを実行するにはどうすればよいですか?
たとえば、次のような SQL クエリがあります。
SELECT P.プロジェクト名、A.番号、B.番号 FROM プロジェクト AS P LEFT JOIN dbo.fn_ProjectNumber(@dateA) AS A ON P.ProjectID = A.ProjectID 左結合 dbo.fn_ProjectNumber(@dateB) AS B ON P.ProjectID = B.ProjectID
ただし、関数から個別に変数を選択し、後で結合するよりもはるかに遅くなります。次に例を示します。
@tempA に挿入 SELECT P.ProjectID、A.Number FROM プロジェクト AS P LEFT JOIN dbo.fn_ProjectNumber(@dateA) AS A ON P.ProjectID = A.ProjectID @tempB に挿入 SELECT P.ProjectID、B.Number FROM プロジェクト AS P 左結合 dbo.fn_ProjectNumber(@dateB) AS B ON P.ProjectID = B.ProjectID SELECT P.プロジェクト名、A.番号、B.番号 FROM プロジェクト AS P 左 JOIN @tempA AS A ON P.ProjectID = A.ProjectID 左結合 @tempA AS B ON P.ProjectID = B.ProjectID
これの原因は何ですか?高速なクエリを取得し、テーブル変数を回避する方法はありますか?
詳細:
これは私がやっていることと似た例にすぎませんが、関数fn_ProjectNumber(@date datetime)
には4つのテーブル間の結合のようなものが含まれます...