急救!!!数据库优化和sql语句优化

兄弟姐妹们,问一个关于数据库优化和sql语句优化的问题:
我想从表B中查询数据插入到表A中,写了一个如下的sql语句
insert into 表A select * from 表B where B.a||B.b not in (select A.a||A.b from 表A)
说明:
①两张表中都没有建索引
②表A和表B都是用相同的字段a和b做联合主键
③表B向A中插入B中有而A中没有的数据
④表A中有21万行数据,表B中有28万行数据

问题:
sql语句执行的超级慢,四个小时都没有执行完,我怀疑是直接卡死了……

求救,不知道谁对数据库了解,帮忙优化一下数据库或者sql语句,要求在上面说明白了,就是怎么解决慢的问题。

备注!!数据库是达梦数据库
参与15

13同行回答

奥利弗奥利弗数据库开发工程师北纬股份有限公司
啊,我来晚了用8楼的merge实现会很快merge into busing (select *          from a) ion (b.a = i.a and b.b = i.b)when matched then   update      set b.a = i.a, b.b = i.b,b.xx=i.xx    wher...显示全部
啊,我来晚了
用8楼的merge实现会很快
merge into b
using (select *
          from a) i
on (b.a = i.a and b.b = i.b)
when matched then
   update
      set b.a = i.a, b.b = i.b,b.xx=i.xx
    where b.a = i.a
      and b.b = i.b
when not matched then
   insert values (i.a, i.b, i.xx);收起
互联网服务 · 2013-08-05
浏览1373
qifengdieqifengdie软件开发工程师上海秘密公司
13楼的, when matched then 这一步好像不用操作 , 直接when not matched就行了 。显示全部
13楼的, when matched then 这一步好像不用操作 , 直接when not matched就行了 。收起
互联网服务 · 2013-08-05
浏览1369
jxguojxguo需求管理工程师cigmall
select B.* from B left outer join A ON B.a=A.a AND B.b=A.b where A.a is NULL AND A.b is NULL 这个效率是有提升的,但我没理解为什么你的数据库里的表结构里不能设置一些其他的属性管理。给我的感觉是找个时间和对应负责的人重新分析一下目前数据库里存在的冗余数据...显示全部
select B.* from B left outer join A ON B.a=A.a AND B.b=A.b where A.a is NULL AND A.b is NULL 这个效率是有提升的,但我没理解为什么你的数据库里的表结构里不能设置一些其他的属性管理。给我的感觉是找个时间和对应负责的人重新分析一下目前数据库里存在的冗余数据的差异。收起
互联网服务 · 2013-08-01
浏览1390
good2000athenagood2000athena软件开发工程师尚哲
四楼正解.用left join效率最快.二十几万不是大数据.当达到百万,千万级别时,效率才能显出来.测试过.显示全部
四楼正解.用left join效率最快.二十几万不是大数据.当达到百万,千万级别时,效率才能显出来.测试过.收起
互联网服务 · 2013-08-01
浏览1640
housheng33housheng33软件开发工程师农行软件开发中心
select b.* from 表B,表A where b.aa.a or a.bb.b显示全部
select b.* from 表B,表A where b.a<>a.a or a.b<>b.b收起
互联网服务 · 2013-07-30
浏览1607
housheng33housheng33软件开发工程师农行软件开发中心
insert into 表A select * from 表B where B.a||B.b not in (select A.a||A.b from 表A) 建好索引select b.* from 表B,表A where b.aa.a or b.ab.b *  改为所要的字段测试后,麻烦告知一下效果。。。显示全部
insert into 表A select * from 表B where B.a||B.b not in (select A.a||A.b from 表A)

建好索引
select b.* from 表B,表A where b.a<>a.a or b.a<>b.b

*  改为所要的字段

测试后,麻烦告知一下效果。。。收起
互联网服务 · 2013-07-30
浏览1604
qifengdieqifengdie软件开发工程师上海秘密公司
MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN      UPDATE table_name SET col1 = col_val1,col2 = col2_val WHEN NOT MATCHED THEN      INSERT (column_list) ...显示全部
MERGE INTO table_name alias1

USING (table|view|sub_query) alias2

ON (join condition)

WHEN MATCHED THEN

     UPDATE table_name SET col1 = col_val1,col2 = col2_val

WHEN NOT MATCHED THEN

     INSERT (column_list) VALUES (column_values)


搜一下merge用法看看能不能行。收起
互联网服务 · 2013-07-30
浏览1625
jieleejielee软件开发工程师top
如果A、B、要插入的,三项数据量都很大,建议建一个中间表,表C,结构一样,无索引然后在A、B的a\b字段上都建联合索引,然后把要插入的数据插入到C,再删除A中的索引,把C中的数据插入到A中。...显示全部
如果A、B、要插入的,三项数据量都很大,建议建一个中间表,表C,结构一样,无索引

然后在A、B的a\b字段上都建联合索引,然后把要插入的数据插入到C,再删除A中的索引,把C中的数据插入到A中。收起
政府机关 · 2013-07-30
浏览1657
jieleejielee软件开发工程师top
还有一个方案,是在A、B两表相差不远(即表基数很大,但是需要插入的数据并不多)时适用。insert into 表Aselect B.* from 表B Binner join  (select a,b from 表Bexceptselect a,b from  表A) C on B.a=C.a and B.b=C.c此时,A、B两表都需要在a、b字段上建联...显示全部
还有一个方案,是在A、B两表相差不远(即表基数很大,但是需要插入的数据并不多)时适用。
insert into 表A
select B.* from 表B B
inner join  
(select a,b from 表B
except
select a,b from  表A) C on B.a=C.a and B.b=C.c

此时,A、B两表都需要在a、b字段上建联合主键。收起
政府机关 · 2013-07-30
浏览1623
jieleejielee软件开发工程师top
4楼那个,与你的需求,应该是不一致的。insert into 表A select * from 表B where B.a||B.b not in (select A.a||A.b from 表A) 可以改为:insert into 表A select * from 表B b where not exist(select 1 from 表A where a=b.a and b=b.b)另外,如果数据量大,表B的a\b字段有必要...显示全部
4楼那个,与你的需求,应该是不一致的。

insert into 表A select * from 表B where B.a||B.b not in (select A.a||A.b from 表A)

可以改为:

insert into 表A select * from 表B b where not exist(select 1 from 表A where a=b.a and b=b.b)

另外,如果数据量大,表B的a\b字段有必要建一个联合主键。
而表A是需要需要联合主键,需要考虑,要插入的数据与A中已经有的数据,哪个量级更大。收起
政府机关 · 2013-07-30
浏览1580

提问者

cognos大菜鸟
数据仓库开发工程师北京科东
擅长领域: 大数据商业智能服务器

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2013-07-29
  • 关注会员:1 人
  • 问题浏览:6961
  • 最近回答:2013-08-05
  • X社区推广