zoukankan      html  css  js  c++  java
  • SqlSever分页查询,仅扫描一次表

    数据库的分页查询一般由两个查询组成:

    select count(*) from Goods

    select *
    from (
        select row_number() over(order by goodsId) as rowid, *
        from Goods
    ) as a
    where rowid >= @pageSize * (@pageIndex - 1) + 1
    and rowid <= @pageSize * @pageIndex

    第一个查询,获取符合条件的记录总数,用于计算总页数。第二个查询获取指定页上的记录。

    两个查询需要执行两次,也就是做两次表扫描,这对效率是极大的损失。能不能只做一次表扫描?
    row_number()函数在做排名时,肯定需要做一次表扫描,而排名完成后,肯定是知道有多少条记录的,如果这个内部值能输出到外部给调用者使用,那么两个查询就可以合并为一个查询,且仅需要一次表扫描了。
    经过研究,row_number()函数并没有这个功能,但是同时发现 over()这个窗口函数既可以配合排名函数使用,也可以配合聚合函数使用。例如:

    select count(*) over() as recordCount from Goods

    那么,如果利用窗口函数over(),然后同时搭配row_number()排名函数和count()聚合函数,Sql Server的执行计划能否在内部自动优化为仅做一次表扫描?于是查询改为如下:

    select *
    from (
        select count(*) over() as recordTotalCount,
               row_number() over(order by goodsId) as rowid, 
               *
        from Goods
    ) as a
    where rowid >= @pageSize * (@pageIndex - 1) + 1
    and rowid <= @pageSize * @pageIndex    

    经过测试,由于在同一个查询中,都使用了over()窗口函数,Sql Server在生成执行计划时,自动优化为仅进行一次表扫描了

  • 相关阅读:
    [原创]什么是安全性测试
    [原创]如何有效的考核测试人员
    [原创]MySql官方压力测试工具Mysqlslap
    [原创软件测试工作技能
    [原创]如何有效构建测试环境
    [原创]常见系统测试类型总结
    [原创]Kjava手机顽童模拟器
    [原创]浅谈测试人员提交缺陷记录
    [原创]Windows/Unix 资源性能计数器
    [原创]戴明PDCA方法
  • 原文地址:https://www.cnblogs.com/fre2technic/p/3222703.html
Copyright © 2011-2022 走看看