Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tecniche di materializzazione T-SQL CTE non funzionanti su SQL Server 2012

Puoi provare utilizzando una funzione con valori di tabella a più passaggi. In questo modo, il server è costretto a materializzare i risultati del TVF in una variabile di tabella. Inoltre, potresti provare utilizzando vincoli dichiarativi quando si dichiara il tipo di tabella this (PRIMARY KEY, UNIQUE, CHECK) per migliorare le prestazioni della query 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;

Non dimenticare di aggiungere il ORDER BY clausola alla tua domanda finale.

Di recente, ho utilizzato questa soluzione per ottimizzare una vista (ViewA, DISTINCT + LEFT JOIN + GETDATE()) utilizzata da un'altra vista (ViewB). In questo caso (ViewA) era impossibile creare una vista indicizzata (a causa di DISTINCT + LEFT JOIN + GETDATE()). Invece, ho creato un TVF multi-statement che ha migliorato le prestazioni riducendo le letture logiche (drasticamente in alcuni casi) della query finale.

Nota:ovviamente, puoi provare utilizzando una vista indice .