Rumah > Artikel > pangkalan data > Apakah kaedah paging dalam pelayan SQL?
Artikel ini bercakap tentang kaedah halaman pelayan SQL, menggunakan pelayan SQL versi 2012. Dalam yang berikut, pageIndex digunakan untuk mewakili bilangan halaman, dan pageSize mewakili rekod yang terkandung pada halaman. Dan yang berikut melibatkan contoh khusus, tetapkan pertanyaan halaman 2, setiap halaman mengandungi 10 rekod.
Pertama sekali, mari kita bincangkan tentang perbezaan antara paging pelayan SQL dan paging MySQL boleh dilengkapkan secara langsung dengan menggunakan had (pageIndex-1) dan pageSize, tetapi pelayan SQL tidak mempunyai kata kunci had. hanya sesuatu seperti had Kata kunci teratas. Jadi paging lebih menyusahkan.
Saya hanya tahu empat jenis paging pelayan SQL: gelung tiga kali ganda menggunakan maks (kunci utama) menggunakan kata kunci row_number, offset/fetch kata kunci seterusnya (diringkaskan dengan mengumpul kaedah orang lain di Internet , sepatutnya ada sahaja); empat kaedah ini pada masa ini, kaedah lain adalah berdasarkan ubah bentuk ini).
Sebahagian daripada rekod jadual pelajar untuk disoal
Mula-mula ambil halaman 20 teratas, dan kemudian terbalikkan tertib, dan ambil 10 rekod pertama dalam susunan terbalik, supaya anda boleh mendapatkan data yang diperlukan untuk paging, tetapi tertib terbalik Anda kemudiannya boleh mengembalikannya dalam susunan terbalik, atau anda boleh berhenti mengisih dan menyerahkannya terus ke bahagian hadapan untuk diisih.
Terdapat kaedah lain yang boleh dianggap sebagai jenis ini Saya tidak akan meletakkan kod di sini untuk mengecualikan 10 rekod ini, dan kemudian Pertanyaan.
-- 设置执行时间开始,用来查看性能的 set statistics time on ; -- 分页查询(通用型) select * from (select top pageSize * from (select top (pageIndex*pageSize) * from student order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。 as temp_sum_student order by sNo desc ) temp_order order by sNo asc -- 分页查询第2页,每页有10条记录 select * from (select top 10 * from (select top 20 * from student order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。 as temp_sum_student order by sNo desc ) temp_order order by sNo asc ;
Mula-mula, atas 11 rekod baris pertama, kemudian gunakan maks (id) untuk mendapatkan id terbesar, dan kemudian tanya semula 10 rekod teratas dalam jadual ini, tetapi anda mesti menambah syarat, di mana id>
set statistics time on; -- 分页查询(通用型) select top pageSize * from student where sNo>= (select max(sNo) from (select top ((pageIndex-1)*pageSize+1) sNo from student order by sNo asc) temp_max_ids) order by sNo; -- 分页查询第2页,每页有10条记录 select top 10 * from student where sNo>= (select max(sNo) from (select top 11 sNo from student order by sNo asc) temp_max_ids) order by sNo;
untuk terus menggunakan fungsi row_number() over(order by id) untuk mengira bilangan baris dan pilih nombor baris yang sepadan untuk dikembalikan Walau bagaimanapun, kata kunci ini hanya tersedia dalam pelayan SQL 2005 atau ke atas .
set statistics time on; -- 分页查询(通用型) select top pageSize * from (select row_number() over(order by sno asc) as rownumber,* from student) temp_row where rownumber>((pageIndex-1)*pageSize); set statistics time on; -- 分页查询第2页,每页有10条记录 select top 10 * from (select row_number() over(order by sno asc) as rownumber,* from student) temp_row where rownumber>10;
set statistics time on; -- 分页查询(通用型) select * from student order by sno offset ((@pageIndex-1)*@pageSize) rows fetch next @pageSize rows only; -- 分页查询第2页,每页有10条记录 select * from student order by sno offset 10 rows fetch next 10 rows only ;
offset A baris, buang rekod A pertama, ambil baris B seterusnya sahaja, untuk Kemudian baca data B.
Akhir sekali, saya merangkumkan paging prosedur tersimpan adalah mudah untuk semua orang memanggil, supaya apabila tiba masanya untuk menulis paging, anda boleh terus memanggil prosedur tersimpan ini.
Prosedur tersimpan paging
create procedure paging_procedure ( @pageIndex int, -- 第几页 @pageSize int -- 每页包含的记录数 ) as begin select top (select @pageSize) * -- 这里注意一下,不能直接把变量放在这里,要用select from (select row_number() over(order by sno) as rownumber,* from student) temp_row where rownumber>(@pageIndex-1)*@pageSize; end -- 到时候直接调用就可以了,执行如下的语句进行调用分页的存储过程 exec paging_procedure @pageIndex=2,@pageSize=10;
Berdasarkan masa pelaksanaan empat kaedah paging di atas, kita boleh tahu bahawa antara empat kaedah paging di atas, yang kedua dan ketiga Ketiga, prestasi kaedah ketiga dan keempat adalah hampir sama, tetapi prestasi kaedah pertama adalah sangat lemah dan tidak disyorkan. Selain itu, blog ini sedang menguji sejumlah kecil data dan masih belum melambai sejumlah besar data, jadi tidak jelas kaedah mana yang mempunyai prestasi yang lebih baik apabila sejumlah besar data perlu dihalakan. Saya mengesyorkan kaedah keempat di sini Lagipun, kaedah keempat adalah kaedah baru yang diperkenalkan selepas syarikat pelayan SQL dinaik taraf, jadi ia secara teorinya harus mempunyai prestasi dan kebolehbacaan yang lebih baik.
Cadangan berkaitan: "tutorial mysql"
Atas ialah kandungan terperinci Apakah kaedah paging dalam pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!