问一条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; |