【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】OB-CE-4.2.1
【问题描述】两个表做关联查询,使用merge join hint,关联字段使用索引,为什么执行计划中还是显示需要SORT呢?
诚挚地求大神解答!感谢!
多造点数据试试~
t1 和 t2 表,各插入了100W数据,执行计划除了代价升高外,其余的没变化
只在字段b上建立了索引k1,为什么强制使用两个表的k1索引就可以不用重排序?
以下回答是我的个人理解:为什么没选上索引,原因是因为是因为你是 select *,索引里只包含索引键 b 和主键 a 这两个列,但是你还需要返回 c 这个列,这就需要再从索引回到主表中查询 c 列的值,索引回表的代价很大,所以计划就不选择利用这个索引的计划了。你可以试试把 select * 改成 select a, b 或者把索引改成 k1(b, c)试试,这样应该就会走索引了。
单查索引列或做一个覆盖索引,的确可以走k1索引并且不排序;
但是为什么强制指定使用k1索引后(/*+USE_MERGE(t1, t2),INDEX(t1 k1),INDEX(t2 k1)*/
),不增加索引且依然selelct *时,可以不用排序呢
好的,我看一下,谢谢
因为索引已经是按照 b 列有序的了,归并 join 时只需要保证 b 列有序就够了,索引中又有 a 列,根据主键 a 列的值就可以在主表中查到 c 列的值。
没理解您说的排序是想对什么再进行一次排序?
1 个赞
啊,理解了,非常感谢!
客气了