Bạn có thể thử bằng cách sử dụng một hàm giá trị bảng nhiều bước. Bằng cách này, máy chủ buộc phải hiện thực hóa kết quả của TVF thành một biến bảng. Ngoài ra, bạn có thể thử sử dụng các ràng buộc khai báo khi khai báo loại bảng này (PRIMARY KEY, UNIQUE, CHECK) để cải thiện hiệu suất của truy vấn cuối cùng:
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;
Đừng quên thêm ORDER BY
mệnh đề cho truy vấn cuối cùng của bạn.
Gần đây, tôi đã sử dụng giải pháp này để tối ưu hóa một chế độ xem (ViewA, DISTINCT + LEFT JOIN + GETDATE ()) được sử dụng bởi một chế độ xem khác (ViewB). Trong trường hợp này (ViewA) không thể tạo chế độ xem được lập chỉ mục (vì DISTINCT + LEFT JOIN + GETDATE ()). Thay vào đó, tôi đã tạo một TVF nhiều câu lệnh để cải thiện hiệu suất bằng cách giảm số lần đọc logic (trong một số trường hợp) của truy vấn cuối cùng.
Lưu ý:Tất nhiên, bạn có thể thử sử dụng chế độ xem chỉ mục .