Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-SQL-CTE-Materialisierungstechniken, die auf SQL Server 2012 nicht funktionieren

Sie könnten es versuchen Verwenden einer mehrstufigen Tabellenwertfunktion. Auf diese Weise wird der Server gezwungen, die Ergebnisse des TVF in eine Tabellenvariable zu materialisieren. Sie können es auch versuchen Verwendung deklarativer Einschränkungen bei der Deklaration dieses Tabellentyps (PRIMARY KEY, UNIQUE, CHECK), um die Leistung der letzten Abfrage zu verbessern:

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;

Vergessen Sie nicht, den ORDER BY hinzuzufügen Klausel zu Ihrer letzten Abfrage.

Kürzlich habe ich diese Lösung verwendet, um eine Ansicht (ViewA, DISTINCT + LEFT JOIN + GETDATE()) zu optimieren, die von anderen Ansichten (ViewB) verwendet wird. In diesem Fall konnte (ViewA) keine indizierte Ansicht erstellen (wegen DISTINCT + LEFT JOIN + GETDATE()). Stattdessen habe ich eine TVF mit mehreren Anweisungen erstellt, die die Leistung verbessert, indem die logischen Lesevorgänge (in einigen Fällen drastisch) der letzten Abfrage reduziert wurden.

Hinweis:Natürlich können Sie es versuchen mit einer Indexansicht .