基于MSSQLSQL数据库大批量数据的分块分页查询
/*
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条记录,根据时间排序取数据(最近原则),页面大小和页用户可指定。
关于在不同环境下测试,耗时就不必贴出了。
有疑问或者有其它更好的建议,请跟贴。