博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 千万级别数据查询优化
阅读量:5868 次
发布时间:2019-06-19

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

说明:平时很少接触到大数据分页,今天有兴趣在数据库插入1000万条数据进行测试,经过查询相关资料得到如下说明:

笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示,便考虑用rownum来做,下面是具体方法(每页显示20条):
语句:"select * from tabname where rownum<20 order by name"
但却发现oracle却不能按自己的意愿来执行,而是先随便取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询来实现先排序,后rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。
后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;方法不变:
"select * from tabname where rownum<20 order by name"

----------------------------------------------------------------

涉及到大数据量的查询时我们一般不会想要全部查看,而只是想要汇总、根据条件筛选、查询前面几页数据等。鉴于此用上面的解决方案却不能查询从21到40之间的数据,特修改语句如下:

select * from(  select s.*,rownum rowN from tabname s order by stuno desc) m where m.rowN between 200 and 300

使用之后才发现效率还是比较慢,因为嵌套查询内部每次都要检索tabname的所有数据,故在此修改如下:

select * from(  select s.*,rownum rowN from tabname s where rownum<300 order by stuno desc) m where m.rowN between 200 and 300

因为查询的是前200到300之间的数据,所以没有比较检索表中所有数据,故在嵌套查询内部加了个rownum<300进行筛选。当我们越是往后面分页,那么嵌套查询内部数据越大,效率就越低,但是如果只考虑查询前面几页数据,无疑是最好的方式。

转载于:https://www.cnblogs.com/duanjt/p/5381476.html

你可能感兴趣的文章
在Python中调用Java扩展包HanLP测试记录
查看>>
Flutter中的Image入门讲解
查看>>
深度解析@angular/platform-browser-dynamic
查看>>
Rancher安装文档
查看>>
Android爬坑之旅之WebView
查看>>
安装pm2与nginx
查看>>
css 外联式 和 导入式 的区别
查看>>
2019年叶叶的前端开篇
查看>>
阿里云移动端播放器高级功能---截图和音频波形
查看>>
用ABAP代码读取S/4HANA生产订单工序明细
查看>>
PostgreSQL 优化器代码概览
查看>>
es6基础知识
查看>>
js关闭当前页面(支付宝,微信,app)
查看>>
199. Binary Tree Right Side View
查看>>
JVM上的响应式流 — Reactor简介
查看>>
什么是SAP GUI的client
查看>>
年终总结
查看>>
多集群应用如何帮助企业级Kubernetes获益
查看>>
告别webpack react 搭建多页面之痛
查看>>
Linux Redis 高可用之主从复制
查看>>