重新描述下问题:
-----------------------查询一----------------------
select .... from A
  left join B 
     on A.id=B.id-----------------------查询二----------------------
select .... from A
  left join (
      (select .... from B)B1  union all (select ... from C)C1 on B1.id=C1.id 
   )B2 
     on A.id=B2.id数据量:A=4百万条,B=5百万条,C=10条
这两个句子执行效率差别非常大:
查询一:15秒左右
查询二:3分种左右请高手指点 有没有好的优化方法?

解决方案 »

  1.   

    补充下 是 oracle 数据库
      

  2.   

    重新描述下问题:
    -----------------------查询一----------------------
    select .... from A
      left join B 
         on A.id=B.id-----------------------查询二----------------------
    select .... from A
      left join (
          (select .... from B)  union all (select ... from C)
       )B2 
         on A.id=B2.id数据量:A=4百万条,B=5百万条,C=10条
    这两个句子执行效率差别非常大:
    查询一:15秒左右
    查询二:3分种左右请高手指点 有没有好的优化方法?
      

  3.   

    针对第二个
    left join b on
    ...
    left join c on
    ...
    干嘛union all
      

  4.   

    两个left join就好了啊
    P.S 回复的时候引用一下 否则收不到消息
      

  5.   

    你查询下两个SQL的执行计划,从磁盘的IO,和CPU耗费不难看出两个查询的差距
      

  6.   

    select .... from A
      left join B
    on a.id=b.id
    union 
    select ... from a 
    left join c  
    on a.id=c.id
      

  7.   

    如果表的条数非常多sql语句又不能再优化了那就对记录行数多的表实现分区表技术,绝对可以提高查询速度!
      

  8.   

    首先观察一下 表中的记录是否可以按照某个字段值进行分类,如果可以的话就用这个字段对表进行分区表处理  假如你的表结构是这样 customers(id,name,dept)
    你可以先建一个分区表 customers_t 语句如下:
    CREATE TABLE customers_t( 
         id    INT PRIMARY KEY , 
         name VARCHAR (20), 
         dept VARCHAR (10) 
     ) 
     PARTITION BY LIST (dept) 
     ( 
         PARTITION dept1 VALUES ('dept2') TABLESPACE xxx, 
         PARTITION dept2 VALUES ('dept2') TABLESPACE xxx
     );
    然后执行 insert into customers_t select * from customers;
             rename customers to customers_old;
             rename customers_t to customers;
    查询的时候这样写语句
              select * from customers PARTITION (dept1);
    上面所有语句用到的dept1 dept2 是dept字段的具体值,注意分区名后面的dept1不用加单引号,分区名规定必须字母开头且不能包含-