Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Técnicas de materialização T-SQL CTE não funcionam no SQL Server 2012


Você pode tentar usando uma função com valor de tabela de várias etapas. Desta forma, o servidor é forçado a materializar os resultados do TVF em uma variável de tabela. Além disso, você pode tentar usando restrições declarativas ao declarar este tipo de tabela (PRIMARY KEY, UNIQUE, CHECK) para melhorar o desempenho da 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;

Não se esqueça de adicionar o ORDER BY cláusula para sua consulta final.

Recentemente, usei esta solução para otimizar uma visualização (ViewA, DISTINCT + LEFT JOIN + GETDATE()) usada por outras visualizações (ViewB). Neste caso (ViewA) foi impossível criar uma view indexada (por causa de DISTINCT + LEFT JOIN + GETDATE()). Em vez disso, criei um TVF multi-instrução que melhorou o desempenho reduzindo as leituras lógicas (drasticamente em alguns casos) da consulta final.

Observação:claro, você pode tentar usando uma exibição de índice .