基於MSSQLSQL資料庫大批次資料的分塊分頁查詢

mybillliu發表於2005-05-09
/*
create table tmp
(
gdate datetime default getdate(),
gid int
)

*/
/*
declare @i int

set @i = 1

while @i<1000000
begin

INSERT tmp(gid) values(@i)

print '-------' + cast(@i as char(10))
set @i = @i + 1

end


select count(*) from tmp
*/
-------------------------------
--@page 需要取出第幾頁
--@pageSize 用於分頁時,每頁顯示的記錄數目
--@blockSize 在大批次資料庫中不必每次取pageSize條記錄,每次取一批資料,減輕資料庫負擔
declare @page int,@pageSize int,@sql char(300),
@blockSize int,@d datetime
set @page = 100000
set @blockSize = 400
set @pageSize = 20



if @page =1
begin
set @sql = 'select top ' + cast(@blockSize as varchar) +
' * from tmp order by gdate desc '
end
else
begin
set @sql =
'select top '
+
cast(@blockSize as varchar)
+
' *
from tmp
where gdate<
(select min(gdate) from
(
select top '
+
cast((@page - 1)* @pageSize as varchar)
+
' gdate from tmp order by gdate desc
) as t
)
order by gdate desc'
end

print @sql

set @d=getdate()

exec(@sql)

select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())


--select * from t where gid<50000 order by gdate desc

使用者先根據上面的程式碼新建一個表tmp
我在實際應用中為測試效率問題,因此插入了1KW條記錄進行效率考驗
根據實際測試,效率還非常高,使用者在實際應用中可參考或應用上面的程式碼。不過沒有考慮到併發使用者訪問資料庫情況。
原理:主要是分塊取資料,上面程式碼中我每次取400條記錄,根據時間排序取資料(最近原則),頁面大小和頁使用者可指定。
關於在不同環境下測試,耗時就不必貼出了。
有疑問或者有其它更好的建議,請跟貼。

相關文章