问一条sql执行效率的问题

今夜有雨 2010-08-09
上周五在公司测试数据库上跑了一条sql,今早来看,晕~~竟然还没跑完。。。杯具。。。
我猜可能是sql写非常极其十分烂的原因,我的数据库方面的知识也是很差很差的,希望大家帮我看看怎么优化。(问题对大家可能是很简单的,je大牛太多了,不过对我这样的新手就有点难了。大家别说我。。。。)

假设两张表
create table A(id number,status number);
create table B(id number);
数据量都是1000万条,我要将B中有但A中没有的ID插入到A中,并且将A.status=0,我的sql这样写的:
insert into A(id,status) select 0,B.id where B.id not in(select A.id from A);

其中,A.id和B.id都建了索引。
我知道这条语句效率很低下,特别not in那里,但是没想到执行了两天三夜还没执行完,大家能帮我优化下吗?
smilesail 2010-08-11
not in 不使用索引 建了也没用 可以使用not exist
我爱小白 2010-08-11
可以采用临时表,通过临时表把数据插入A中去
Felix韩 2010-08-12
insert into A(id,status)
select id, 0 from B
where id in (-- 获得存在于B中而不存在于A中的id;
select id from B
except
select id from A
)
希望对你有所帮助!
tfwin2 2010-08-12
oracle:
insert into A(ID,STATUS)
select id,0 from B where
not exists(select 1 from A  WHERE B.ID=A.ID);

没经过大数据量测试,因为一般不这么写SQL
量大的话,建议在语句后边加上

and id <=10000 or id>=1;类似条件进行阶段性测试一般来讲10000执行多长时间
那么1000万就乘1000倍能估算出来


导数或比对,习惯用触发器或过程
但是这个不能用游标,用游标就别想效率高了
yidao620c 2010-08-12
使用Oracle10G增强的merge into语句:

MERGE INTO A
  USING B
    ON (A.ID = B.ID)
  WHEN NOT MATCHED THEN
    INSERT (ID, status)
    VALUES (B.ID, '0');
ytsmtxxi 2010-08-13
Felix韩 写道
insert into A(id,status)
select id, 0 from B
where id in (-- 获得存在于B中而不存在于A中的id;
select id from B
except
select id from A
)
希望对你有所帮助!



这样子不可行。当id有很多的时候,肯定出错。
dabing013 2010-08-13
可以试试这个
INSERT INTO A
  SELECT T.ID, 0
    FROM (SELECT T2.ID FROM B T2
           MINUX
          SELECT T1.ID FROM A T1
          ) T;
dabing013 2010-08-13
如果是DB2,用import和load将更快
oracle的imp和exp,我不太清楚他们的效率
sjynt131 2010-08-13
试试这个:
insert into a(id,status)
select b.id,0 from b left join a on b.id=a.id
where a.id is null;
Global site tag (gtag.js) - Google Analytics