项目中遇到问题,大概是这样子:
假设有A表:name  age
小明   11
小红   12
小丽   13B表name  sex 
小明   男
小红   女
小丽   女C表name  hobby
小明   足球
小红   唱歌
小丽   跳舞我现在要查出小明的所有记录,像这样的结果:
B表name  age   sex  hobby    
小明   11    男   足球有两种选择:
 第一种:select  a.name,age,sex,hobby 
from
   ( 
    select name,age from A where name='小明'
   ) a,
    ( 
    select name,sex   from B  where name='小明'
   ) b,
    ( 
    select name,hobby from C  where name='小明'
   ) c
where a.name=b.name
and   b.name =c.name第二种:
select  a.name,age,sex,hobby 
from
   ( 
    select name,age from A 
   ) a,
    ( 
    select name,sex   from B 
   ) b,
    ( 
    select name,hobby from C  
   ) c
where a.name=b.name
and   b.name =c.name
and  a.name='小明'
鉴于项目中数据量很大,大概上亿,而且实际表和查询条件比较多,我这里只是举例子,所以弄得少,我想问下这两种哪种sql快?为什么?

解决方案 »

  1.   

    自己理解
    应该都一样的
    每个表都先是从name='小明'
    再关联查询的
      

  2.   

    用toad或者是sqldeveloper等工具去试着执行你上面的SQL语句,然后看SQL语句的执行计划,看它是怎么走的,是进行全表扫描呢,还是索引扫描,执行完成之后它应该会显示查询耗费的时间,观察比较一下,你自己就知道答案是什么了。执行计划走索引扫描在数据量大的时候效率肯定是高于全表扫描的。
      

  3.   

    这两个SQL语句Cost是一样的,但是多表结合查询的时候他们的读取行数不一样。
    楼主把第2条SQL语句改称这样他们俩就完全一样的了。select  a.name,age,sex,hobby 
    from
       ( 
        select name,age from A 
       ) a,
        ( 
        select name,sex   from B 
       ) b,
        ( 
        select name,hobby from C  
       ) c
    where a.name=b.name
    and   b.name =c.name
    and  a.name='小明'
    and  b.name='小明'
    and  c.name='小明'这种问题,只要查看他们的执行计划就很快得出来了,原理你就看看他们的执行计划把。
      

  4.   

    楼上,请教下:b.name='小明'和b.name='小明' 用写吗?我如果不写,读取出来的行数和效率会有变化吗?
      

  5.   


    支持,这个ORACLE的计算量比较少,过滤掉条件再关联查询,省掉关联的计算次数,其实你可以去看执行计划 ,再比较的
      

  6.   

    这两个查询Cost怎么可能一样呢,Oracle查询是先执行子SQL,再执行主SQL,第二种查询会导致A,B,C三张表都全表查询,第一种查询只会每个表查询一条数据,然后拼起来.如果三张表数据都上亿,第二个查询语句我估计会引起系统荡机;第一种则会很快,楼主可以试一下.
      

  7.   

    sql语句都差不多   不过个人认为第二种要快点
      

  8.   

    要是name是唯一性的话 建个索引心许速度还要高
      

  9.   

    你还是自己实验吧,把autotrace打开,看看一致读是多少
      

  10.   

    A,B,C表中的name列不是主键吗??
    主键的话不是因该默认索引吗?
    还有
    from
       ( 
        select name,age from A where name='小明'
       ) a,
        ( 
        select name,sex   from B  where name='小明'
       ) b,
        ( 
        select name,hobby from C  where name='小明'
       ) c这是Oracle特别语法吗?
    直接
    select *
    from A,B,C
    where a.name=b.name
    and   b.name =c.name
    and  a.name='小明'不好吗?
    为什么先查询,再给查询结果起个别名  怎么那么奇怪啊?
    谁给解释一下啊
      

  11.   

    Oracle的Cost不是这么算得,主要是跟数据分布,取得结果有关系。这两个语句数据分布和取得结果肯定一样,所以Oracle的Cost是一样的。
    楼主简单试验一下就知道了。
      

  12.   

    要是没有你的Oracle版本,表的结构,Index等等信息,很难给你正确答案。
    [SET AUTOTRACE TRACEONLY]看看你的执行结果。
    这样最快!结果要是看不明白,你把结果贴上来,帮你分析一下。