CTE
tidak (harus) "diaktualisasikan". Bukannya itu pasti akan menyalin semua baris di tempat lain dan akan melakukan operasi lain atas salinan (meskipun mungkin berperilaku sehingga pengoptimal memutuskan itu lebih baik).
Jika kita mengambil kueri sederhana ini:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY id) rn
FROM mytable
) q
WHERE rn BETWEEN 101 AND 110
dan lihat rencananya kita akan melihat sesuatu seperti ini:
|--Filter(WHERE:([Expr1003]>=(101) AND [Expr1003]<=(110)))
|--Top(TOP EXPRESSION:(CASE WHEN (110) IS NULL OR (110)<(0) THEN (0) ELSE (110) END))
|--Sequence Project(DEFINE:([Expr1003]=row_number))
|--Segment
|--Clustered Index Scan(OBJECT:([ee].[dbo].[mytable].[PK__mytable__3213E83F29C2D227]), ORDERED FORWARD)
Di sini, catatan dipindai (dalam id
pesan karena tabel dikelompokkan pada id
), menetapkan ROW_NUMBER
(inilah Sequence Project
tidak) dan diteruskan ke TOP
yang hanya menghentikan eksekusi ketika ambang tertentu tercapai (110
catatan dalam kasus kami).
110 catatan tersebut diteruskan ke Filter
yang hanya melewati catatan dengan rn
lebih besar dari 100.
Kueri itu sendiri hanya memindai 110
catatan:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
(строк обработано: 10)
Table 'mytable'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
dalam 3 halaman.
Sekarang mari kita lihat kueri yang tidak diberi halaman:
SELECT *
FROM mytable
ORDER BY
id
Yang ini cukup sederhana:baca semuanya dari tabel dan keluarkan.
|--Clustered Index Scan(OBJECT:([ee].[dbo].[mytable].[PK__mytable__3213E83F29C2D227]), ORDERED FORWARD)
Namun, mencari dengan mudah bukan berarti dilakukan dengan mudah. Tabelnya cukup besar dan kita perlu melakukan banyak pembacaan untuk mengembalikan semua catatan:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(строк обработано: 1310720)
Table 'mytable'. Scan count 1, logical reads 2765, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 266 ms, elapsed time = 11690 ms.
Jadi, singkatnya, kueri pagination hanya tahu kapan harus berhenti.