• SQL server 分页


    常用的数据分页方法

    我们经常会碰到要取n到m条记录,就是有分页思想,下面罗列一下一般的方法。

    我本地的一张表 tbl_FlightsDetail,有300多W记录,主键 FlightsDetailID(Guid),要求按照FlightsDetailID排序 取 3000001 到3000010 之间的10条记录,也是百万级。

    方法1 定位法 (利用ID大于多少)

    语句形式:

    select top 10 * from tbl_FlightsDetail where FlightsDetailID>(
           select max(FlightsDetailID) from ( 
                  select top 3000000 FlightsDetailID from tbl_FlightsDetail order by FlightsDetailID
           ) as t
    ) order by FlightsDetailID

    执行计划:

    先查出 top 300000,再聚合取这个集合中最大的Id1,再过滤 id大于id1的集合(上图中使用到索引),再取top 10 条。

    方法2 (利用Not In)


    语句形式:

    select top 10* from tbl_FlightsDetail where FlightsDetailID not in (
           select top 3000000 FlightsDetailID from tbl_FlightsDetail order by FlightsDetailID
    ) order by FlightsDetailID

    执行计划:

    和方法一类似,只是过滤where条件不一样,这里用到的是not in,上图中没有用到索引,耗时8秒。如果 FlightsDetailID不是索引的话,方法1和该方法将差不多。

    方法3 (利用颠颠倒倒top)

    语句形式:

    select top 10* from (
           select top 3000010* from tbl_FlightsDetail order by FlightsDetailID
    ) as t  order by t.FlightsDetailID desc

    执行计划:

    先取 前面3000010条记录,再倒序,这时再取前面10条即是300001 到300010条记录,没有用到索引,耗时11秒

    方法4 (ROW_NUMBER()函数)

    语句形式:

    select * from (
           select *,ROW_NUMBER() OVER (ORDER BY FlightsDetailID) as rank from tbl_FlightsDetail
    )  as t where t.rank between 3000001 and 3000010

     执行计划:

    Sql 2005版本或以上支持,也没用到索引,耗时2秒,速度还不错。

    方法5 (利用IN)

    此方法是由 金色海洋(jyk)阳光男孩 回复的,飞常感谢,语句形式:

    select top 10 * from tbl_FlightsDetail  where FlightsDetailID in( 
           select top 10 FlightsDetailID from(  
                  select top 3000010 FlightsDetailID from tbl_FlightsDetail order by FlightsDetailID
           ) as t order by t.FlightsDetailID desc 
    ) order by FlightsDetailID

    执行计划:

    多次执行之后一般维持在4秒左右,用到索引,非常不错,计划图还很长,只截取部分,可能是绕的多一点。

    我个人喜欢Row_number() over()

    摘自:http://www.cnblogs.com/qqlin/archive/2012/11/01/2745161.html

  • 相关阅读:
    Python学习
    我的计算机网络复习笔记(第一章)
    理解DES算法
    彻底理解RSA加密算法
    扩展欧几里得算法求模的乘法逆元
    python的deque(双向)队列详解
    对于暴力枚举的一些优化方法的题解
    python中的多(liu)元(mang)交换 ,赋值
    python定义函数后跟->的意义
    直接暴力做分糖问题
  • 原文地址:https://www.cnblogs.com/shuaichao/p/4389876.html
Copyright © 2020-2023  润新知