sql >> Databáze >  >> RDS >> Sqlserver

Techniky materializace T-SQL CTE nefungují na SQL Server 2012

Můžete to zkusit pomocí vícekrokové tabulkové funkce. Tímto způsobem je server nucen zhmotnit výsledky TVF do proměnné tabulky. Také to můžete zkusit použití deklarativních omezení při deklaraci tohoto typu tabulky (PRIMARY KEY, UNIQUE, CHECK) ke zlepšení výkonu konečného dotazu:

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;

Nezapomeňte přidat ORDER BY klauzule k vašemu závěrečnému dotazu.

Nedávno jsem toto řešení použil k optimalizaci pohledu (ViewA, DISTINCT + LEFT JOIN + GETDATE()) používaného jinými pohledy (ViewB). V tomto případě (ViewA) nebylo možné vytvořit indexovaný pohled (kvůli DISTINCT + LEFT JOIN + GETDATE()). Místo toho jsem vytvořil vícepříkazový TVF, který zlepšil výkon snížením logických čtení (v některých případech drasticky) konečného dotazu.

Poznámka:Samozřejmě to můžete zkusit pomocí zobrazení indexu .




  1. ~/.psqlrc soubor pro DBA

  2. Jak spravovat relace v Node.js pomocí Passport, Redis a MySQL

  3. Aktualizovat časové razítko při aktualizaci řádku v PostgreSQL

  4. PostgreSQL dotaz ILIKE s SQLAlchemy