oracle 不走索引的select 是如果查询的?

济南大飞哥 2017-12-11 09:44:38
假设数据编码从1到10,select 时从1那头查,还是10那头开始的?
...全文
498 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmcc135 2017-12-13
  • 打赏
  • 举报
回复
把二楼和六、七楼的回答综合起来就够了 只是要看技术细节的资料,就没那么好找了。 我的理解是: oracle在处理诸如select * from a_big_table的时候 应该是先找出 a_big_table这个表所使用的第一个块 块内的rowid可以认为是按照升序没有错,由于记录会进行增删改操作,这个升序也就跟表里的具体数值无关了 然后是第二个块、第三个块......同样由于记录增删改的缘故,块的编号也是没有规则的
minsic78 2017-12-13
  • 打赏
  • 举报
回复
因为一张表的数据可能被不停删除和插入,所以在一个数据块,或者相邻的数据之间,他们其实根本不会有什么必然联系,所以你主题贴的问题其实也就无法回答
minsic78 2017-12-13
  • 打赏
  • 举报
回复
楼主如果觉得这个事情很重要,可以用10046观察,需要指出的是:oracle最小访问单元是数据块,一个块可以有n条记录,而想要知道一个块中的读取顺序怕不是连易事了,不过,通过索引得到rowid和全表扫描完全是两回事情,而若是想知道块中所有记录都被读取时,顺序如何,恐怕要读oracle源代码才能知道了
济南大飞哥 2017-12-12
  • 打赏
  • 举报
回复
引用 4楼我是你的主体 的回复:
[quote=引用 3楼碧水幽幽泉 的回复:]不过,无论它如何变化,始终还是按照如下顺序执行的: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。
假设我没有指定排序,我说的编号是存储编号(Rowid),那么他是倒序还是正序还是不保证什么规则?[/quote]单表查询,没有where条件,是直接扫描的高水位下的数据吗?顺序是存储顺序。
济南大飞哥 2017-12-12
  • 打赏
  • 举报
回复
引用 3楼碧水幽幽泉 的回复:
不过,无论它如何变化,始终还是按照如下顺序执行的: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。
假设我没有指定排序,我说的编号是存储编号(Rowid),那么他是倒序还是正序还是不保证什么规则?
碧水幽幽泉 2017-12-11
  • 打赏
  • 举报
回复
不过,无论它如何变化,始终还是按照如下顺序执行的: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。
碧水幽幽泉 2017-12-11
  • 打赏
  • 举报
回复
Oracle不像python,python是从数据编码最小的数开始执行起。 Oracle比它复杂多了,不能简单地说从1开始,还是从10开始。 select语句有非常多,而且极其灵活的写法,需要结合具体的场景分析。
卖水果的net 2017-12-11
  • 打赏
  • 举报
回复
楼主可以了解一下oracle 的存储格式。

17,082

社区成员

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

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