試すことができます マルチステップのテーブル値関数を使用します。このようにして、サーバーはTVFの結果をテーブル変数に具体化するように強制されます。また、試すことができます このテーブルタイプ(PRIMARY KEY、UNIQUE、CHECK)を宣言するときに宣言型制約を使用して、最終的なクエリのパフォーマンスを向上させます。
CREATE FUNCTION CocoJamboSchema.CocoJamboFunction(@parameters ...)
RETURNS @Results TABLE (
Col1 INT NOT NULL,
Col2 VARCHAR(10) NULL,
...
PRIMARY KEY(Col1)
)
AS
BEGIN
WITH MyCTE (...)
AS
(
...
)
INSERT @Results (...)
FROM MyCTE;
RETURN;
END;
SELECT ...
FROM CocoJamboSchema.CocoJamboFunction(param values) f
INNER JOIN MySchema.MyTable t ON f.Col1=t.Col1
ORDER BY t.Col1;
ORDER BY
を追加することを忘れないでください 最終クエリの句。
最近、このソリューションを使用して、別のビュー(ViewB)で使用されるビュー(ViewA、DISTINCT + LEFT JOIN + GETDATE())を最適化しました。この場合、(ViewA)はインデックス付きビューを作成できませんでした(DISTINCT + LEFT JOIN + GETDATE()のため)。代わりに、最終クエリの論理読み取り(場合によっては劇的に)を減らすことでパフォーマンスを向上させるマルチステートメントTVFを作成しました。
注:もちろん、試すことができます インデックスビュー を使用する 。