非常简单的问题,但我不会从a表中选出字段aaa的值在b表中字段bbb中存在。并插入临时表a表4千万的记录,b表800条记录我用
insert into yjxxb_temp
select rowid as oldrowid, sjjdm as sjjdm, jdjdm as jdjdm,'0' as bj
from gd_yjxxb where (sjjdm in (select oldjgdm from all_record)
or jdjdm in (select oldjgdm from all_record))
oracle817会进行一次fast index scan,速度特慢,十几个小时完不了。
上面那sql语句的解释计划是这样的
1此计划步骤通过依次扫描叶节点来检索 B*-tree 索引 GD_YJXXB_SJJDM_JDJDM 中的所有 ROWID。
2此计划步骤对范围分区表的所有分区进行迭代。
3此计划步骤检索表 ALL_RECORD 中的所有行。
4此计划步骤检索表 ALL_RECORD 中的所有行。
5此计划步骤接受多组行。第一组中的行要用第二到 n 组中的数据删除。
6此计划步骤将该语句指定为 INSERT 语句。有哪为达人有好的解决方案啊?

解决方案 »

  1.   

    分两句执行吧:
    insert into yjxxb_temp
    select rowid ,sjjdm,jdjdm,'0'
    from gd_yjxxb a 
    where exists (select 1 from all_record b 
                  where a.sjjdm=b.oldjgdm);insert into yjxxb_temp
    select rowid ,sjjdm,jdjdm,'0'
    from gd_yjxxb a 
    where exists (select 1 from all_record b 
                  where a.jdjdm=b.oldjgdm);