码迷,mamicode.com
首页 > 数据库 > 详细

Oracle优化:千万级大表逻辑判断的累赘

时间:2016-02-26 12:32:26      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:oracle

insert into pntmall_point_detail(PNTMALL_PNT_ID, ...........                          HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)  SELECT PNTMALL_PNT_ID,.......,PNTMALL_NUM,0    FROM pntmall_point_detail_tmp a   WHERE NOT EXISTS (SELECT b.PNTMALL_PNT_ID            FROM pntmall_point_detail b           WHERE a.PNTMALL_PNT_ID = b.PNTMALL_PNT_ID);


PNTMALL_POINT_DETAIL包含3800万条数据,cost 6 hours。


优化后

 

delete from pntmall_point_detail_tmp a where exists (select 1 from pntmall_point_detail b where a.PNTMALL_PNT_ID = b.PNTMALL_PNT_ID);
insert into pntmall_point_detail(PNTMALL_PNT_ID, ...........                          HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)  SELECT PNTMALL_PNT_ID,.......,PNTMALL_NUM,0    FROM pntmall_point_detail_tmp a

cost 5 minutes。


其实还可以进一步优化

drop indexBER.INDEX_POD_PNTMALL_HAIERUID;
drop indexBER.PNTMALL_POINT_ID_HAIERUID;
 
 
delete from pntmall_point_detail_tmp a where exists (select 1from pntmall_point_detailb where a.PNTMALL_PNT_ID =b.PNTMALL_PNT_ID);
 
 
insert/*+append*/into pntmall_point_detail(PNTMALL_PNT_ID,....
                         HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)
  SELECT PNTMALL_PNT_ID,....,PNTMALL_NUM,0
    FROM pntmall_point_detail_tmp a;
create index BER.INDEX_POD_PNTMALL_HAIERUID
on BER.PNTMALL_POINT_DETAIL (PNTMALL_HAIERUID) online nologing;
create unique index
BER.PNTMALL_POINT_ID_HAIERUID on BER.PNTMALL_POINT_DETAIL (PNTMALL_PNT_ID) online nologing;



总体优化思路,不要在insert中加入过多的判断语句,删索引,append,重建索引,如果是归档模式,alter table nologing;append 只适用于insert select 这种方式,而且insert后要加commit,否则无法进行其他DML操作。


实测 append 1600万条数据,cost 8s

Oracle优化:千万级大表逻辑判断的累赘

标签:oracle

原文地址:http://suifu.blog.51cto.com/9167728/1745210

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!