[High-Performance]Using ROW_NUMBER() to paginate your data with SQL Server 2005(数亿级海量数据瞬间闪现)

测试环境:
Intel PR Dual T3200 @2.00GHz
3G Mem

测试数据:
268,783,125条数据(~2.6亿条数据)
表结构(表未分区):

-------+--------------+----------------
ID          int PK,               聚集
-------+--------------+----------------
namee    navrchar(50),    唯一,非聚集

测试脚本:


DECLARE @setsegments AS INT--当前段:2100
SET @setsegments=2100

DECLARE @allcount AS INT--总数据量
SET @allcount=(SELECT rowcnt FROM [sysindexes] WHERE id=OBJECT_ID('Test'AND keycnt<2)

DECLARE @segmentsize AS INT--每段数据量:50
SET @segmentsize=50

DECLARE @begin AS INT
SET @begin=@segmentsize*@setsegments

DECLARE @end AS INT
SET @end=@segmentsize*@setsegments+@segmentsize

  
SELECT top(@segmentsize) ID,namee FROM (SELECT  ROW_NUMBER() OVER(ORDER BY ID DESC
  
AS rownum,ID,namee FROM Test WITH (NOLOCK)) 
  
AS t
        
WHERE
        t.rownum  
between @begin and @end
ORDER BY ID DESC


测试结果:
Sql Server Profiler's Duration平均在:0.03s,可谓之瞬间。

注意点:
segmentsize不能开的太大,否则比较耗时。(无限扩大则认为全表)

结论:性能较好(并发资源占用未测试)。
对于大部分数据模型均适用,只要select字段索引适当,亿万级也是瞬间!

扩展:如查询字段较多,而且查询字段索引较差则可:


SELECT ID,namee,xx1,xx2,xx3FROM Test where ID 
    
IN
    (
    
SELECT top(@segmentsize) ID FROM (SELECT  ROW_NUMBER() OVER(ORDER BY ID DESCAS rownum,ID FROM Test WITH (NOLOCK)) AS t
        
WHERE
        t.rownum 
between @begin and @end
     )
ORDER BY ID DESC
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值