sql >> Base de Datos >  >> RDS >> Sqlserver

Las técnicas de materialización de T-SQL CTE no funcionan en SQL Server 2012

Podrías intentar utilizando una función con valores de tabla de varios pasos. De esta forma, el servidor se ve obligado a materializar los resultados del TVF en una variable de tabla. Además, podrías probar usando restricciones declarativas al declarar este tipo de tabla (CLAVE PRIMARIA, ÚNICA, COMPROBAR) para mejorar el rendimiento de la consulta final:

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;

No olvides agregar el ORDER BY cláusula a su consulta final.

Recientemente, utilicé esta solución para optimizar una vista (ViewA, DISTINCT + LEFT JOIN + GETDATE()) utilizada por otras vistas (ViewB). En este caso (ViewA) fue imposible crear una vista indexada (debido a DISTINCT + LEFT JOIN + GETDATE()). En su lugar, creé un TVF de varias declaraciones que mejoró el rendimiento al reducir las lecturas lógicas (drásticamente en algunos casos) de la consulta final.

Nota:por supuesto, podrías intentar usando una vista de índice .