CTE を具体化し、ビューのパフォーマンスを向上させるには、次の手法を使用する必要があります。
WITH CTE AS(
SELECT TOP 100 PERCENT
ORDER BY ...
)
WITH CTE AS(
SELECT TOP 2147483647
ORDER BY ...
)
さて、この方法はどちらも機能しません。誰かが同じ問題に直面したり、SQL Server 2012 でこれが有効でないかどうかを知っていますか?
CTE を具体化し、ビューのパフォーマンスを向上させるには、次の手法を使用する必要があります。
WITH CTE AS(
SELECT TOP 100 PERCENT
ORDER BY ...
)
WITH CTE AS(
SELECT TOP 2147483647
ORDER BY ...
)
さて、この方法はどちらも機能しません。誰かが同じ問題に直面したり、SQL Server 2012 でこれが有効でないかどうかを知っていますか?
マルチステップのテーブル値関数を使用してみることができます。このようにして、サーバーは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を作成しました。
注:もちろん、インデックスビューを使用してみることができます。