Rumah  >  Artikel  >  pangkalan data  >  Apakah kaedah paging dalam pelayan SQL?

Apakah kaedah paging dalam pelayan SQL?

醉折花枝作酒筹
醉折花枝作酒筹ke hadapan
2021-08-06 09:22:003928semak imbas

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

Apakah kaedah paging dalam pelayan SQL?

Kaedah 1: Tiga gelung

Idea

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.

Pelaksanaan kod

-- 设置执行时间开始,用来查看性能的
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
;

Hasil pertanyaan dan masa

Apakah kaedah paging dalam pelayan SQL?

Apakah kaedah paging dalam pelayan SQL?

Kaedah 2: Gunakan maks (kunci utama)

  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>

Pelaksanaan kod

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;

Keputusan pertanyaan dan masa

Apakah kaedah paging dalam pelayan SQL?

Apakah kaedah paging dalam pelayan SQL?

Kaedah 3: Gunakan kata kunci row_number

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 .

Pelaksanaan SQL

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;

Hasil pertanyaan dan masa

Apakah kaedah paging dalam pelayan SQL?

Apakah kaedah paging dalam pelayan SQL?

Kaedah jenis keempat: offset /fetch next (hanya tersedia dalam versi 2012 dan ke atas)

Pelaksanaan kod

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.

Keputusan dan masa berjalan

Apakah kaedah paging dalam pelayan SQL?

Apakah kaedah paging dalam pelayan SQL?

Prosedur tersimpan berkapsul

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;

Ringkasan

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!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:sqlyog怎么导入sql文件Artikel seterusnya:带你了解SQL注入(详细)