Możesz spróbować za pomocą wieloetapowej funkcji wartości tabeli. W ten sposób serwer jest zmuszony do zmaterializowania wyników TVF w zmiennej tabeli. Możesz też spróbować używanie ograniczeń deklaratywnych podczas deklarowania tego typu tabeli (PRIMARY KEY, UNIQUE, CHECK) w celu poprawy wydajności końcowego zapytania:
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;
Nie zapomnij dodać ORDER BY
klauzula do końcowego zapytania.
Ostatnio wykorzystałem to rozwiązanie do optymalizacji widoku (ViewA, DISTINCT + LEFT JOIN + GETDATE()) używanego przez inne widoki (ViewB). W tym przypadku (ViewA) nie można było utworzyć widoku indeksowanego (z powodu DISTINCT + LEFT JOIN + GETDATE()). Zamiast tego stworzyłem wieloinstancyjny TVF, który poprawił wydajność poprzez zmniejszenie odczytów logicznych (w niektórych przypadkach drastycznie) końcowego zapytania.
Uwaga:oczywiście, możesz spróbować przy użyciu widoku indeksu .