Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Paging sisi server di SQL Server

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa tujuan menggunakan OPTION(MAXDOP 1) di SQL Server?

  2. Teknik yang lebih baik untuk memangkas angka nol di depan di SQL Server?

  3. Sesi Penyimpanan Asp.Net 4.0 di SqlServer

  4. Bagaimana menemukan kolom mana yang tidak memiliki data (semua nilai adalah NULL)?

  5. SQL - Pivot table dan group dengan tidak bekerja