请问对几百万级数据量 Order by 主键 查询如何优化啊?

落落叶叶无声 2016-12-29 06:42:46
数据库版本:11g

数据量:8百万
使用语句
SELECT * FROM oe.product_information ORDER BY PRODUCT_ID DESC;
Select出500行需要40s左右,怎么优化啊?



解析计划如下:


表结构


product_id为主键


...全文
879 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
落落叶叶无声 2016-12-30
  • 打赏
  • 举报
回复
引用 5 楼 fengsuiyingdong 的回复:
需要多少就取多少,不要全部取出吧
落落叶叶无声 2016-12-30
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
要查出所有的数据吗? 那用不用索引就没什么意义了; 你是不是要做分页?
谢谢版主,能不能帮忙看下上面的问题
落落叶叶无声 2016-12-30
  • 打赏
  • 举报
回复
引用 4 楼 jdsnhan 的回复:
什么条件都没有,然后对800万数据做order by,怎么优化都快不了。 真正的需求场景是什么啊。 是否可以加入过滤条件,是否可以做分区等等要根据业务需求判定
@jdsnhan 这只是我自己学习的一个测试表,所以没什么实际需求 但是我发现一个问题

SELECT * FROM oe.product_information WHERE product_id < 50000 ORDER BY PRODUCT_ID DESC--大概有4万多
select出30行大概用了15-20s

SELECT * FROM oe.product_information  WHERE  product_id > 50000 ORDER BY PRODUCT_ID DESC ---大概有800万多数据
select出30行结果几乎是秒出 第一个句子的product_id<50000是不连续递增的,即可能是1,2,4,5,7,8.....而>50000的所有product_id是连续递增的。 为什么会有这种差别?
  • 打赏
  • 举报
回复
需要多少就取多少,不要全部取出吧
jdsnhan 2016-12-30
  • 打赏
  • 举报
回复
什么条件都没有,然后对800万数据做order by,怎么优化都快不了。 真正的需求场景是什么啊。 是否可以加入过滤条件,是否可以做分区等等要根据业务需求判定
Tiger_Zhao 2016-12-30
  • 打赏
  • 举报
回复
<50000
记录是按照主键次序存放的,反正要全部字段返回,所以直接顺序读取,一直到发现 >=50000 的记录为止。

>50000
就必须用索引定位了,无法直接读取。
落落叶叶无声 2016-12-30
  • 打赏
  • 举报
回复
引用 12 楼 Tiger_Zhao 的回复:
数据库有缓存。
你学习用的数据库应该是不常访问吧,通常缓存是空的。
第一次查询要读硬盘,比较慢。
而且大量读取后(第一次查询结束数据库有空闲),数据库“估计”你还要用到该表,会尽量把你还没访问过的数据也随后读入缓存。
后面的查询都是直接从缓存(内存)中取,所以很快。

一般测试性能,同一个查询反复运行几次,前几次耗时差别很大的不算。


< 50000 的那条sql的解析计划 =====全表扫描


>50000的那条sql的解析计划======范围索引扫描


其实就<50000里边有部分product_id是无序的。> 50000的依次+1递增的。
这是导致了解析计划的不同的原因吗?
落落叶叶无声 2016-12-30
  • 打赏
  • 举报
回复
引用 6 楼 u012557814 的回复:
[quote=引用 4 楼 jdsnhan 的回复:] 什么条件都没有,然后对800万数据做order by,怎么优化都快不了。 真正的需求场景是什么啊。 是否可以加入过滤条件,是否可以做分区等等要根据业务需求判定
@jdsnhan 这只是我自己学习的一个测试表,所以没什么实际需求 但是我发现一个问题

SELECT * FROM oe.product_information WHERE product_id < 50000 ORDER BY PRODUCT_ID DESC--大概有4万多
select出30行大概用了15-20s

SELECT * FROM oe.product_information  WHERE  product_id > 50000 ORDER BY PRODUCT_ID DESC ---大概有800万多数据
select出30行结果几乎是秒出 第一个句子的product_id<50000是不连续递增的,即可能是1,2,4,5,7,8.....而>50000的所有product_id是连续递增的。 为什么会有这种差别?[/quote] 第一个句子的product_id<50000是不连续递增的 ===>sorry, 是非递增。1000-2000这个区间的product_id无序
Tiger_Zhao 2016-12-30
  • 打赏
  • 举报
回复
数据库有缓存。
你学习用的数据库应该是不常访问吧,通常缓存是空的。
第一次查询要读硬盘,比较慢。
而且大量读取后(第一次查询结束数据库有空闲),数据库“估计”你还要用到该表,会尽量把你还没访问过的数据也随后读入缓存。
后面的查询都是直接从缓存(内存)中取,所以很快。

一般测试性能,同一个查询反复运行几次,前几次耗时差别很大的不算。
sun孙迎涛 2016-12-30
  • 打赏
  • 举报
回复
帮顶
H_Gragon 2016-12-30
  • 打赏
  • 举报
回复
帮顶!
卖水果的net 2016-12-30
  • 打赏
  • 举报
回复
引用 7 楼 u012557814 的回复:
谢谢版主,能不能帮忙看下上面的问题
数据量少了,自然会快一些,跟号码是否连续,也没什么关系;
卖水果的net 2016-12-29
  • 打赏
  • 举报
回复
要查出所有的数据吗? 那用不用索引就没什么意义了; 你是不是要做分页?
落落叶叶无声 2016-12-29
  • 打赏
  • 举报
回复
Select出30行用了41s

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧