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

2021-09-08 21:36:19 字數 3035 閱讀 1322

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

@iint

set@i=0

while(@i

<

10000)

begin

insert

into pagetest select

cast(floor(rand()*

10000) as

int),left(newid(),10),getdate()

set@i=

@i+1end

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

--

寫法1,not in/top

select

top50

*from pagetest

where id not

in (select

top9900 id from pagetest order

by id)

order

by id

--寫法2,not exists

select

top50

*from pagetest

where

notexists

(select

1from (select

top9900 id from pagetest order

by id)a where a.id=pagetest.id)

order

by id

--寫法3,max/top

select

top50

*from pagetest

where id>(select

max(id) from (select

top9900 id from pagetest order

by id)a)

order

by id

--寫法4,row_number()

select

top50

*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

and9950

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

select

*from (

select row_number()over(order

by tempcolumn)rownumber,*

from (select

top9950 tempcolumn=

0,*from pagetest where1=

1order

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,nvarch,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...