各位老师,我在oracle里创建了一张临时表,写了一条查询语句,单独执行查询语句速度非常快,不到1秒钟数据集就出来了
大概有70多条数据,但是如果把这些数据insert到临时表速度非常慢,大概200秒。
比如
查询的语句为 select c1,c2 from tb  速度非常快,不到1s
插入的语句为 into temp_tb(c1,c2) select c1,c2 from tb 速度非常慢200s(注释:temp_tb表没有索引,没有触发器等)
我尝试用create table tb1 as select select c1,c2 from tb 也非常慢,大概也是200s。
我又复制了一份temp_tb表结构,创建一张表tb1,插入tb1也是非常慢。
我又测试了,单独insert into temp_tb values()速度非常快
insert into temp_tb select 'a','b' from dual 也非常快
insert into temp_tb select 'a','b' from tb where 0=0 也非常快.

解决方案 »

  1.   

    我之前做过类似的插入从来没出现过这样的问题啊,而且我里面的数据比你说的多多了
    如果两张表结构相同,你用insert into temp_tb select * from tb 试试看插入全部数据会不会有这样的问题 
      

  2.   

    使用forall集合的方式插入速度将会得到改善。
      

  3.   

    你能否确认insert之后的select与单独执行的select是完全相同的吗?请检查insert语句与select语句的执行计划
      

  4.   

    谢谢大家关心,是这样的,本来单独查询不慢,但只要加上insert into就慢
    原语句是这样的
    select * from t1
    inner join t2 on t1.c1=t2.c1
    where t1.c1=1 and exists (select * from t3 where t1.c1=t3.c1)
    这句查询时很快,但在前面加上inert into 后就很慢
    后来我这样修改的,在前面加insert into 就很快了。
    select * from t1
    inner join t2 on t1.c1=t2.c1
    where t1.c1=1 and exists(select * from t3 where t3.c1=1)
      

  5.   

    现在就有这么个问题,在exists里的子语句,条件应该如何写
    是t1.c1=t3.c1 还是 t3.c1=t1.c1
    不知哪个快,下次再测试下。