Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Les techniques de matérialisation T-SQL CTE ne fonctionnent pas sur SQL Server 2012

Vous pourriez essayer à l'aide d'une fonction de table à plusieurs étapes. De cette façon, le serveur est obligé de matérialiser les résultats du TVF dans une variable de table. Aussi, vous pourriez essayer utilisation de contraintes déclaratives lors de la déclaration de ce type de table (PRIMARY KEY, UNIQUE, CHECK) pour améliorer les performances de la requête finale :

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;

N'oubliez pas d'ajouter le ORDER BY clause à votre requête finale.

Récemment, j'ai utilisé cette solution pour optimiser une vue (ViewA, DISTINCT + LEFT JOIN + GETDATE()) utilisée par une autre vue (ViewB). Dans ce cas (ViewA) était impossible de créer une vue indexée (à cause de DISTINCT + LEFT JOIN + GETDATE()). Au lieu de cela, j'ai créé un TVF multi-instructions qui a amélioré les performances en réduisant les lectures logiques (de manière drastique dans certains cas) de la requête finale.

Remarque :Bien sûr, vous pourriez essayer en utilisant une vue d'index .