sql >> Databasteknik >  >> RDS >> Sqlserver

T-SQL CTE-materialiseringstekniker fungerar inte på SQL Server 2012

Du kan försöka använder en flerstegstabellvärderad funktion. På detta sätt tvingas servern att materialisera TVF:s resultat till en tabellvariabel. Du kan också försöka använder deklarativa begränsningar när du deklarerar denna tabelltyp (PRIMARY KEY, UNIQUE, CHECK) för att förbättra prestandan för den slutliga frågan:

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;

Glöm inte att lägga till ORDER BY klausul till din slutliga fråga.

Nyligen använde jag den här lösningen för att optimera en vy (ViewA, DISTINCT + LEFT JOIN + GETDATE()) som används av en annan vy (ViewB). I det här fallet var (ViewA) omöjligt att skapa en indexerad vy (på grund av DISTINCT + LEFT JOIN + GETDATE()). Istället skapade jag en TVF med flera påståenden som förbättrade prestandan genom att minska de logiska läsningarna (drastiskt i vissa fall) av den slutliga frågan.

Obs! Självklart kan du försöka med en indexvy .




  1. DAYNAME() Exempel – MySQL

  2. MySQL:Union of a Left Join with a Right Join

  3. Konvertera heltal till hex och hex till heltal

  4. Hur man löser ORA-29285:filskrivfel