Contoh:
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS ON;
CREATE TABLE MyTable (MyID INT PRIMARY KEY);
GO
INSERT MyTable (MyID)
VALUES (11), (22), (33), (44), (55);
PRINT 'Test MyCTE:';
WITH MyCTE
AS (
SELECT *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
FROM MyTable
)
SELECT *
FROM MyCTE crt
LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;
ROLLBACK;
Jika Anda menjalankan skrip sebelumnya di SSMS (tekan Ctrl+M
-> Rencana Eksekusi Aktual) maka Anda akan mendapatkan rencana eksekusi ini untuk kueri terakhir:
Dalam hal ini, CTE dijalankan satu kali untuk crt
alias dan lima (!) kali untuk prev
alias, sekali untuk setiap baris dari crt
.
Jadi, jawaban untuk pertanyaan ini
adalah both
:sekali per kueri (crt
) dan sekali per baris (prev
:sekali untuk setiap untuk dari crt
).
Untuk mengoptimalkan kueri ini, sebagai permulaan,1) Anda dapat mencoba menyimpan hasil dari CTE (MyCTE
atau Query
) menjadi variabel tabel atau tabel temp
2) Tentukan kunci utama tabel ini sebagai kolom gabungan,
3) Tulis ulang kueri terakhir untuk menggunakan variabel tabel atau tabel temp ini.
Tentu saja, Anda dapat mencoba menulis ulang kueri terakhir tanpa bergabung sendiri di antara CTE.