博客
关于我
【SqlServer】解析SqlServer的分页
阅读量:404 次
发布时间:2019-03-05

本文共 1757 字,大约阅读时间需要 5 分钟。

数据库分页方法比较与优化

在数据库查询中,分页是常见的需求之一。针对不同的场景和数据库类型,有多种分页方法可以选择。本文将详细介绍四种常见的分页方式,并对其优缺点进行分析,帮助开发者做出最佳选择。

一、四种分页方法的实现方式

  • 方式1:基于计算的分页方法

    这种方法通过计算当前页数和页面大小来确定需要查询的记录范围。以页数为例,假设总页数为10,且需要获取第5页的内容,查询语句如下:

    select top 10 * from test where id not in (select top 40 id from test order by id)order by id

    原理:

    需要获取数据库中的第5页,即40-50条记录。首先查询前40条记录的id值,然后排除这些id值,获取剩余部分的前10条记录。这种方法适用于小型数据,但在大数据量情况下性能较差。

  • 方式2:基于最大值的分页方法

    这种方法通过先获取前40条记录的最大id值,然后查询id大于该最大值的记录。语句如下:

    select top 10 * from test where id > (select max(id) from (select top 40 id from test order by id) as A)order by id

    原理:

    先查询前40条记录,获取其最大id值。如果id为null,则返回0,否则查询id大于该最大值的记录。这种方法在id为IDENTITY(1,1)类型时可以进行优化。

  • 方式3:基于行编号的分页方法

    这种方法通过为每条记录生成行编号,然后筛选特定范围的记录。语句如下:

    select * from (select *, row_number() over(order by id) as rownumber from test) A where rownumber > 40 and rownumber <= 50

    原理:

    使用row_number函数为表中的每条记录生成编号,并根据编号筛选出大于40且小于等于50的记录。这种方法适用于大数据量的表,但row_number计算可能会对性能产生影响。

  • 方式4:基于 OFFSET 和 FETCH 的分页方法

    这种方法是最简洁的方式之一,直接使用 OFFSET 和 FETCH 来获取特定范围的记录。语句如下:

    select * from test order by id offset 40 rows fetch next 10 rows only

    原理:

    首先对记录进行排序,然后使用OFFSET指定从哪一条记录开始,FETCH指定返回的记录数量。这种方法需要有排序字段,且在大型数据库中通常会建立索引以提高性能。

  • 二、方法分析与优化

  • 方式1的优化

    在大型数据库中,方式1的性能可能较差。为了优化,可以结合IDENTITY(1,1)类型的id字段,使用以下查询方式:

    select * from test where id > @page-1 and id <=@pageSize

    这种方法需要确保id字段有适当的索引。

  • 推荐方法

    建议根据实际场景选择最优方法。若表中已有排序索引,推荐使用方式4或方式3。方式4的语法简单,性能较好,而方式3适用于需要行编号的场景,但可能对大数据量产生较大影响。

  • 存储过程优化

    创建一个存储过程来实现分页功能,代码如下:

    alter procedure pageDemo @pageSize int, @page int asdeclare @temp intset @temp = @pageSize * (@page - 1)begin    select top (@pageSize) * from test where id not in (select top (@temp) id from test)    order by idend

    调用方式:

    exec pageDemo 10, 5
  • 三、总结

    以上四种分页方法各有优劣,选择哪种方法取决于具体需求和数据库类型。在实际开发中,建议根据数据量和查询性能进行综合评估,并根据实际字段特性选择最优方法。对于大型数据库, 建议建立合适的索引以提高查询性能。

    转载地址:http://cehzz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
    查看>>
    Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>