SQL Server 2005的ROW_NUMBER()分頁效率比較

創建數據表,插入相應數據。表結構以下,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()函數

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()分頁方式效率要更高一些。

相關文章
相關標籤/搜索