Oracle数据库查询高效分页

简介:

由于网页渲染速度的影响,在C/S程序中那种一个Grid包含几千、上万行的数据基本上在网页是无法展现的,因此一般采用分页的形式显示(也可能采用Visual Srolling方式加载的,企业应用系统的不是很常见),ASP.NET 的数据控件一般带有分页功能,3.5以后还提供了单独的分页控件,也有用过AspNetPager这个第三方的组件。

  分页的控件实在很方便,以前的处理方式就是数据都拿出来,然后由控件进行处理,一般数据量不大的时候应该说感觉不出来优劣,但由于每次从数据库取的时候都是取所有的数据,肯定会增加数据库的压力,传输的数据库多了对网络带宽也会产生压力的。很有可能查出来1万条数据,最后显示只用到启用50条,翻页的时候又重新去查1万条数据,显示之后的的又50条。

  以下的分页SQL比较常见的,在SQL Server也有对应的使用TOP关键字的版本,记得刚学Oralce的时候就想着怎么不能rownum between minValue and maxValue的用法。与最初的疑惑的原理一样,rownum是在查询过程中生成的,因此以下的SQL其实是查出来5300行,然后扔掉了前面5000行,返回后面的300行。当然这种已经进了一大步的,由数据库返回的数据变少的,只是当查询的页数比较大的时候,查询还是存在一定的浪费。

  1. select * 
  2.   from (select a.*, rownum as rnum 
  3.           from (select * from yz_bingrenyz) a 
  4.          where rownum <=5300) 
  5.  where rnum >= 5000

  Linq提供了Skip和Take的API可以用于分页,由于使用的是Entity Framework,在好奇的驱使下用EFProfiler查看生成的SQL,才知道这样以下分页更好。 主要就是使用了row_numer()over()这样的分析函数,可以直接找到那第5000行开始的地方,然后在取出30行就行了。

  1. select * 
  2.   from (select * 
  3.           from (select t.*, 
  4.                        row_number() OVER(ORDER BY nullAS "row_number" 
  5.                   from yz_bingrenyz t) p 
  6.          where p."row_number" > 5000 
  7.         ) q 
  8.  where rownum <= 30

  比较分析:

  本机测试前者耗时1.3s,后者仅0.25s,从以下的执行计划也能看出差异来。

  实际应用

  如果每次查询都要写这种SQL那肯定比较麻烦,可以采用存储过程进行封装,但由于要动态执行SQL,效率肯定又要打折扣,所以在ASP.NET中用C#封装函数比较好,对于没有使用实体框架的而用ADO.NET的,传入表名 、主键名、页数、要取的行数作为参数,用DBCommand进行执行返回结果即可。








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
20小时前
|
Oracle 关系型数据库 数据库
Oracle数据库协议适配器错误解决方法
Oracle数据库协议适配器错误解决方法
7 2
|
3天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
14 6
|
3天前
|
SQL Oracle 关系型数据库
零基础入门 Oracle数据库:轻松上手
零基础入门 Oracle数据库:轻松上手
6 0
|
3天前
|
Oracle 关系型数据库 Java
java操作多数据源将oracle数据同步达梦数据库
java操作多数据源将oracle数据同步达梦数据库
|
4天前
|
SQL 关系型数据库 MySQL
MySQL数据库的约束+进阶版新增与查询-2
MySQL数据库的约束+进阶版新增与查询
12 1
|
4天前
|
关系型数据库 MySQL 测试技术
MySQL数据库的约束+进阶版新增与查询-1
MySQL数据库的约束+进阶版新增与查询
15 1
|
5天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
15 0
|
7天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句
|
8天前
|
存储 监控 Apache
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
网易的灵犀办公和云信利用 Apache Doris 改进了大规模日志和时序数据处理,取代了 Elasticsearch 和 InfluxDB。Doris 实现了更低的服务器资源消耗和更高的查询性能,相比 Elasticsearch,查询速度提升至少 11 倍,存储资源节省达 70%。Doris 的列式存储、高压缩比和倒排索引等功能,优化了日志和时序数据的存储与分析,降低了存储成本并提高了查询效率。在灵犀办公和云信的实际应用中,Doris 显示出显著的性能优势,成功应对了数据增长带来的挑战。
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
|
12天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)

推荐镜像

更多