Paging data di SQL Server dengan OFFSET FETCH
Bandingkan cara paging modern OFFSET FETCH dengan pendekatan lama memakai TOP dan subquery.
Masalah paging sebelum SQL Server 2012
Sebelum ada OFFSET FETCH, mengambil halaman data ke-2 dan seterusnya di SQL Server biasanya memerlukan kombinasi ROW_NUMBER() di dalam subquery karena TOP saja hanya bisa mengambil dari awal hasil.
-- Pendekatan lama dengan ROW_NUMBER
WITH Bernomor AS (
SELECT
*,
ROW_NUMBER() OVER (ORDER BY DibuatPada DESC) AS Baris
FROM Artikel
)
SELECT * FROM Bernomor
WHERE Baris BETWEEN 21 AND 40;
OFFSET FETCH yang lebih ringkas
SELECT *
FROM Artikel
ORDER BY DibuatPada DESC
OFFSET 20 ROWS
FETCH NEXT 20 ROWS ONLY;
OFFSET menentukan berapa baris yang dilewati, dan FETCH NEXT menentukan berapa baris yang diambil setelahnya. Klausa ORDER BY wajib disertakan agar hasil paging konsisten di setiap pemanggilan.
Menghitung offset dari nomor halaman
DECLARE @Halaman INT = 3;
DECLARE @UkuranHalaman INT = 20;
SELECT *
FROM Artikel
ORDER BY DibuatPada DESC
OFFSET (@Halaman - 1) * @UkuranHalaman ROWS
FETCH NEXT @UkuranHalaman ROWS ONLY;
Performa pada halaman jauh di belakang
OFFSET yang besar tetap harus melewati seluruh baris sebelumnya secara internal, sehingga halaman terakhir dari data yang sangat besar tetap terasa lambat. Untuk data besar dengan pola akses berurutan, pendekatan keyset pagination berdasarkan nilai kolom terakhir yang dilihat biasanya lebih efisien.
Latihan
Ubah query di atas menjadi bentuk keyset pagination memakai kondisi WHERE DibuatPada < @DibuatPadaTerakhir, lalu bandingkan rencana eksekusinya dengan pendekatan OFFSET FETCH.
