Oracle连接查询的问题
今天看到一个存储过程中有如下的写法:
表结构和数据:
test
id name
a 111
b 222
c 333
其中id为主键。
他是按照这种方式取各个id对应的参数:
select A.name,B.name,C.name from test A, test B, test C where A.id='a' and B.id='b' and C.id='c';
要我取得话就分几段了,如select name from test where id = 'a';select name from test where id = 'b';select name from test where id = 'c';
这两种方式效率分别如何,具体又是怎样的执行过程,我应该怎么分析。
感觉第一种有连接,会先生成笛卡尔积然后再按条件来取吗,。。
------解决方案--------------------当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.
方法1 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
方法2 (高效)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
AND B.EMP_NO = 291;
------解决方案--------------------先顶下楼上。
数据库执行一条sql并不只是查找数据那步。在这之前要解析语句(查询很多数据库内部表),生成执行计划,然后将生成的执行计划和解析后的SQL文本等放进共享池shared pool。这部分所占资源的比重是很高的。
首先要肯定楼主的说法:
select A.name,B.name,C.name from test A, test B, test C where A.id='a' and B.id='b' and C.id='c';
这条语句是生成了笛卡尔积,然后再去筛选数据的。相比于单表取数这块确实费了点周折。但这个消耗的资源相比三条sql分别被parse解析了三次所占的资源来说很小。