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 .