日期:2014-05-17  浏览次数:20795 次

ORACLE执行效率问题
有两张表:A表人员信息表,B表业务表,两张表通过身份证号关联。A表里面身份证号已建立索引,以下两种SQL,哪种执行效率更好:
注:A表有2000万数据,B表只有3万条数据
1、select A.xm from A ,B where A.SFZH=B.SFZH;
2、select (select A.xm from A where A.SFZH=B.SFZH)XM from B;
以上两种,哪个效率更高,效率更高的原因是什么,麻烦你们详细分析分析。
------最佳解决方案--------------------
两个速度应该是一样的。
------其他解决方案--------------------
第二条语句能成立吗?
------其他解决方案--------------------
能的,没有问题!
------其他解决方案--------------------
应该是第一种速度快
------其他解决方案--------------------
为什么第一种快了,原因是什么?
------其他解决方案--------------------
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE 
------其他解决方案--------------------
 ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list> 

上面给出的事Oracle执行sql语句的顺序,LZ可以自己分析一下
另外,不适用子查询应该会好一点
------其他解决方案--------------------
具体得看执行计划。

查询1:大数据的时候,该查询的执行计划会走Hash Join,Hash Join操作是:分别扫描表A,B一次,然后进行Hash连接。

查询2:该查询是相关子查询,就是说外部表查询一行,子查询执行一次,在这个SQL中,表B有3w条记录,那么扫描表A的次数=3w次,尽管子查询会走索引,但是扫描3w次效率是很低的。

所以查询1效率更高。
------其他解决方案--------------------
恩,谢谢你们,我看看你们提供的方案