Вие можете да опитате с помощта на многоетапна функция с таблица. По този начин сървърът е принуден да материализира резултатите от TVF в таблична променлива. Също така, можете да опитате използване на декларативни ограничения при деклариране на този тип таблица (PRIMARY KEY, UNIQUE, CHECK) за подобряване на производителността на крайната заявка:
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;
Не забравяйте да добавите ORDER BY
клауза към окончателната ви заявка.
Наскоро използвах това решение за оптимизиране на изглед (ViewA, DISTINCT + LEFT JOIN + GETDATE()), използван от други изгледи (ViewB). В този случай (ViewA) беше невъзможно да се създаде индексиран изглед (поради DISTINCT + LEFT JOIN + GETDATE()). Вместо това създадох TVF с множество изрази, който подобри производителността, като намали логическите четения (в някои случаи драстично) на крайната заявка.
Забележка:Разбира се, можете да опитате използване на индексен изглед .