Anda bisa mencoba menggunakan fungsi bernilai tabel multi-langkah. Dengan cara ini, server dipaksa untuk mewujudkan hasil TVF ke dalam variabel tabel. Selain itu, Anda dapat mencoba menggunakan batasan deklaratif saat mendeklarasikan jenis tabel ini (KUNCI UTAMA, UNIK, PERIKSA) untuk meningkatkan kinerja kueri akhir:
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;
Jangan lupa tambahkan ORDER BY
klausa untuk permintaan akhir Anda.
Baru-baru ini, saya menggunakan solusi ini untuk mengoptimalkan tampilan (ViewA, DISTINCT + LEFT JOIN + GETDATE()) yang digunakan oleh tampilan lain (ViewB). Dalam hal ini (ViewA) tidak mungkin membuat tampilan yang diindeks (karena DISTINCT + LEFT JOIN + GETDATE()). Sebagai gantinya, saya membuat TVF multi-pernyataan yang meningkatkan kinerja dengan mengurangi pembacaan logis (dalam beberapa kasus secara drastis) dari kueri akhir.
Catatan:Tentu saja, Anda bisa mencoba menggunakan tampilan indeks .