sql >> データベース >  >> RDS >> Sqlserver

SQLServer2012で機能しないT-SQLCTEマテリアライズ手法

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

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




    1. Oracle SQL Developerでトリガーを無効にする方法は?

    2. PostgreSQLシーケンスのHibernateの使用は、シーケンステーブルに影響しません

    3. 可能な限り2番目に高い給与の最良の方法を見つける

    4. MySQLの1対多の関係-モデルを構築する方法は?