幾種常見SQL分頁方式效率比較

2021-09-09 04:33:10 字數 2630 閱讀 5111

1.建立測試環境,(插入100萬條資料大概耗時5分鐘)。

create database dbtest

use dbtest

--建立測試表

create table pagetest

(id int identity(1,1) not null,

col01 int null,

col02 nvarchar(50) null,

col03 datetime null

)--1萬記錄集

declare @i int

set @i=0

while(@i<10000)

begin

insert into pagetest select cast(floor(rand()*10000) as int),left(newid(),10),getdate()

set @i=@i+1

end

2.幾種典型的分頁sql,下面例子是每頁50條,198*50=9900,取第199頁資料。

--寫法1,not in/top

select top 50 * from pagetest

where id not in (select top 9900 id from pagetest order by id)

order by id

--寫法2,not exists

select top 50 * from pagetest

where not exists

(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)

order by id

--寫法3,max/top

select top 50 * from pagetest

where id>(select max(id) from (select top 9900 id from pagetest order by id)a)

order by id

--寫法4,row_number()

select top 50 * from

(select row_number()over(order by id)rownumber,* from pagetest)a

where rownumber>9900

select * from

(select row_number()over(order by id)rownumber,* from pagetest)a

where rownumber>9900 and rownumber<9951

select * from

(select row_number()over(order by id)rownumber,* from pagetest)a

where rownumber between 9901 and 9950

--寫法5,在csdn上一帖子看到的,row_number() 變體,不基於已有字段產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用於產生記錄序號

select *

from (

select row_number()over(order by tempcolumn)rownumber,*

from (select top 9950 tempcolumn=0,* from pagetest where 1=1 order by id)a

)bwhere rownumber>9900

2.分別在1萬,10萬(取1990頁),100(取19900頁)記錄集下測試。

測試sql:

declare @begin_date datetime

declare @end_date datetime

select @begin_date = getdate()

<.....your code.....>

select @end_date = getdate()

select datediff(ms,@begin_date,@end_date) as '毫秒'

1萬:基本感覺不到差異。

10萬:

100萬:

結論:1.max/top,row_number()都是比較不錯的分頁方法。相比row_number()只支援sql2005及以上版本,max/top有更好的可移植性,能同時適用於sql2000,access。

2.not exists感覺是要比not in效率高一點點。

3.row_number()的3種不同寫法效率看起來差不多。

4.row_number() 的變體基於我這個測試效率實在不好。原帖在這裡

ps.上面的分頁排序都是基於自增字段id。測試環境還提供了int,nvarchar,datetime型別字段,也可以試試。不過對於非主鍵沒索引的大資料量排序效率應該是很不理想的。

幾種常見SQL分頁方式效率比較

1.建立測試環境,插入100萬條資料大概耗時5分鐘 create database dbtest use dbtest 建立測試表 create table pagetest id int identity 1,1 not null,col01 int null,col02 nvarchar 50 ...

幾種常見SQL分頁方式效率比較

1.建立測試環境,插入100萬條資料大概耗時5分鐘 create database dbtest use dbtest 建立測試表 create table pagetest id int identity 1,1 not null,col01 int null,col02 nvarchar 50 ...

sql分頁方式及效率比較

好久沒有運算元據庫分頁了,在看了這篇文章 後,感觸很深,萬丈高樓平地起基礎的東東還是時刻準備著。先插入100w條資料用時4 50 declare iint set i 0 while i 1000000 begin insert into pagetest select cast floor ran...