標籤: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_HAIERUIDon BER.PNTMALL_POINT_DETAIL (PNTMALL_HAIERUID) online nologing;create unique indexBER.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最佳化:千萬級大表邏輯判斷的累贅