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

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解析了三次所占的资源来说很小。