創建數據表,插入相應數據。表結構以下,Id爲自增加主鍵:html
插入100萬條測試數據:sql
?緩存
user
table3
go
declare
@
index
int
set
@
index
=0
while @
index
<1000000
begin
insert
into
Users(
Name
)
values
(
'walkingp'
)
set
@
index
=@
index
+1
end
|
接下來先掃盲一下ROW_NUMBER()函數。函數
ROW_NUMBER()函數是根據參數傳遞過來的order by子句的值,返回一個不斷遞增的整數值,也就是它會從1一直不斷自增1,直到條件再也不知足。例如表Users(Id,Name),使用如下sql語句進行查詢:測試
?大數據
select
id,
name
,row_number() over(
order
by
Id
desc
)
as
rowNum
from
users
where
id<10
select
id,
name
,row_number() over(
order
by
Id)
as
rowNum
from
users
where
id<10
|
兩條語句order by排序相反,執行結果以下:spa
如下兩種狀況,一樣取500000到500100中間的數據。code
一、使用ROW_NUMBER()函數。htm
SQL語句以下:blog
declare
@
time
datetime
declare
@ms
int
set
@
time
= getdate()
select
Id,
Name
from
(
select
row_number() over(
order
by
Id)
as
rowNum,*
from
users)
as
t
where
rowNum
between
500000
and
500100
set
@ms=datediff(ms,@
time
,getdate())
print @ms
--毫秒數
|
測試了幾回,平均在250毫秒:
二、使用TOP加NOT IN方法。
SQL語句以下:
select
top
100 *
from
users
where
Id
not
in
(
select
top
500000 id
from
users
order
by
id)
order
by
id
|
平均在236毫秒:
好吧,一塊兒執行看看結果:
或者你認爲SQL存在緩存的問題,把兩部分順序對掉一下:
以上是百萬數據量的對比,再看看1萬條數據下的對比:
經過以上對比能夠咱們能夠獲得這樣的結論:在小數據量下(通常應該認爲是10萬如下,TOP+NOT IN分頁方式效率要比ROW_NUMBER()高;在大數據量下(百萬級)ROW_NUMBER()分頁方式效率要更高一些。