看具体情况,有的情况下走,有的情况不走。
merge join
-- 有表t1plcbase 和t1isd ,plcno都是这两个表的索引
-- 你觉得下面的or走索引么?
select* from t1plcbase x,t1isd y where x.plcno=y.plcno and x.plcno = '2021120106294500019728' or x.plcno = '2021120106294500019728' ;
--看执行计划,里面cost 284593 。cost可以理解为成本,值越大成本越高。
CBO(cost based Optimizer)评估每种不同的执行路径,执行消耗成本最低的获胜。
这里的cost可以理解为评估后的结果。
oracle 中select * from a,b 有人说a,b是inner join ,是不对的,
这种查询方式是生成笛卡尔积——它不使用任何匹配或者选取条件,
而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配
Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。
因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能,即散列连接的效果都比排序合并连接要好。然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。
可以使用USE_MERGE(table_name1 table_name2)来强制使用排序合并连接
Cartesian 笛卡尔积
select* from t1plcbase x,t1isd y where x.plcno=y.plcno 如果单执行这句,是hash join

<

本文探讨了数据库查询优化中的索引使用和JOIN操作。在涉及OR条件的查询中,索引可能仍然有效。MergeJoin需要排序,适合已排序的数据,而HashJoin通常更高效。对于小规模数据,NestedLoop连接可能是优选。LEFT JOIN和INNER JOIN在符合条件时也会利用索引。正确的JOIN顺序和策略对于提高查询性能至关重要。
417

被折叠的 条评论
为什么被折叠?



