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

T-SQL CTE-materialiseringsteknikker virker ikke på SQL Server 2012

Du kunne prøve ved hjælp af en flertrins tabel værdisat funktion. På denne måde tvinges serveren til at materialisere TVF's resultater til en tabelvariabel. Du kan også prøve bruger deklarative begrænsninger, når du erklærer denne tabeltype (PRIMARY KEY, UNIQUE, CHECK) for at forbedre ydeevnen af ​​den endelige forespørgsel:

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;

Glem ikke at tilføje ORDER BY klausul til din sidste forespørgsel.

For nylig brugte jeg denne løsning til at optimere en visning (ViewA, DISTINCT + LEFT JOIN + GETDATE()) brugt af en anden visning (ViewB). I dette tilfælde var (ViewA) umuligt at oprette en indekseret visning (på grund af DISTINCT + LEFT JOIN + GETDATE()). I stedet oprettede jeg en TVF med flere sætninger, der forbedrede ydeevnen ved at reducere de logiske læsninger (drastisk i nogle tilfælde) af den endelige forespørgsel.

Bemærk:Du kan selvfølgelig prøve ved hjælp af en indeksvisning .




  1. Sådan duplikeres tabel i MySQL

  2. Konverter 'datetime2' til 'smalldatetime' i SQL Server (T-SQL-eksempler)

  3. Android til Wamp-serverforbindelse ved hjælp af Android Studio og PHP

  4. mysql SQL:specifik element skal først være og derefter sortere resten af ​​emnerne