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

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在生成执行计划时,自动优化为仅进行一次表扫描了

转载于:https://www.cnblogs.com/fre2technic/p/3222703.html

SqlSever分页查询,仅扫描一次表相关推荐

  1. Oracle分页查询存储过程(适用于单表查询)

    最近在学习存储过程,网上搜了一些例子,然后自己对照着写了一个相对简单的分页查询... 1.创建包 --/ CREATE OR REPLACE PACKAGE PKG_PAGINATION as TYP ...

  2. mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)

    前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...

  3. mysql跨库分页查询_跨库跨表分页

    前言 之前经常思考的一个问题,数据库分表后,分页怎么做才是最好的方案呢?今天就来整理一波. 由来 首先是由来,数据量增大,一张表数据太多的话,会使用分表.同理,一个数据库实例到达瓶颈,所以可能需要分库 ...

  4. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题

    文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...

  5. SQL分页查询方案的性能对比

    作者 | 中国农业银行 吴海存 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 导读 本文主要介绍了基于ROWNUM.主键列/非空唯一性列.分析函数.OFFSET-FETCH NEXT机制的几种S ...

  6. 不同数据库分页查询的实现

    分页查询是数据库查询中经常用到的一项操作,对查询出来的结果进行分页查询可以方便浏览.那么Oracle.SQL Server.MySQL是如何实现查询的呢?本文我们就来介绍这一部分内容. 1. SQL ...

  7. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  8. FreeSql (十六)分页查询

    IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, "Data ...

  9. MyBatis-Plus 之分页查询

    推荐:MyBatis Plus汇总 MyBatis-Plus 之分页查询 首先创建一个数据库表,如下图所示: 然后创建一个Spring Boot项目,pom.xml和配置如下: <?xml ve ...

最新文章

  1. 运行php能运行asp么,配置使web server即能运行asp又能运行PHP(不装Apache)
  2. exit()与_exit()的区别(转)
  3. mysql 5.6 rpm 安装_mysql 5.6 rpm 包安装步骤需要注意的地方
  4. Struts2 Convention Plugin ( struts2 零配置 )
  5. linux查找命令、find、grep总结
  6. 面试官 | count(1)、count(*) 、count(列名) 有什么区别?
  7. java log4j 异步_Log4j2异步日志之异步格式化
  8. 高性能相关----爬虫
  9. poj2488-A Knight's Journey【DFS】
  10. Linux运维工程师简历项目经验
  11. H5标签在页面被转译
  12. ITeye 2012年8月最后一周重要新闻回顾
  13. mysql 小于转义_MyBatis中大于和小于号的转义写法
  14. c#控件弹幕效果_求C#弹幕游戏弹幕的代码
  15. webstorm下载安装过程打开项目
  16. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛错题笔记
  17. 【华人学者风采】毛景文 中国地质科学院
  18. 河南师范大学计算机学院地址,河南师范大学校区有几个 地址是什么
  19. 高通Android9设置双屏同显示
  20. 我终于读懂了原型模式。。。

热门文章

  1. 设python中有模块m、如果希望同时导入m中的所有成员_python-模块
  2. 怎么p出模糊的照片_36. 盲去卷积 - 更加实用的图像去模糊方法
  3. java私有成员的访问_java – 使用私有成员或公共访问器的方法
  4. php mysql html标签_HTML标签格式化PHP和MySQL
  5. leetcode340. 至多包含 K 个不同字符的最长子串
  6. Python模块(8)-sklearn 简易使用教程
  7. Pytorch(1)-内置/自己设计的损失函数使用
  8. 《Python Cookbook 3rd》笔记(2.17):在字符串中处理html和xml
  9. 《Java8实战》笔记(02):通过行为参数传递代码
  10. 用Tomcat构建一个简单图片服务器