7

CTE を具体化し、ビューのパフォーマンスを向上させるには、次の手法を使用する必要があります。

WITH CTE AS(
    SELECT TOP 100 PERCENT
    ORDER BY ...
)

WITH CTE AS(
    SELECT TOP 2147483647
    ORDER BY ...
)

さて、この方法はどちらも機能しません。誰かが同じ問題に直面したり、SQL Server 2012 でこれが有効でないかどうかを知っていますか?

4

1 に答える 1

9

マルチステップのテーブル値関数を使用してみることができます。このようにして、サーバーは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を作成しました。

注:もちろん、インデックスビューを使用してみることができます。

于 2012-10-27T09:01:54.270 に答える