Oracle优化:千万级大表逻辑判断的累赘
insert into pntmall_point_detail(PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,HPT_REDEMPT_POINT,
HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)
SELECT PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,0 as HPT_REDEMPT_POINT,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,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,HPT_REDEMPT_POINT,
HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)
SELECT PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,0 as HPT_REDEMPT_POINT,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);
insertinto pntmall_point_detail(PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,HPT_REDEMPT_POINT,
HPT_LEFT_POINT,HPT_FULLREDEMPT_STATUS)
SELECT PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATEDT,
PNTMALL_RPTPNT_ID,PNTMALL_HAIERUID,
PNTMALL_OPTYPE_ID,PNTMALL_OPTYPE_DESC,
PNTMALL_NUM,PNTMALL_EXPDT,0 as HPT_REDEMPT_POINT,PNTMALL_NUM,0
FROM pntmall_point_detail_tmp a;
commit;
WHERE NOT EXISTS (SELECT b.PNTMALL_PNT_ID
FROMpntmall_point_detail b
WHEREa.PNTMALL_PNT_ID = b.PNTMALL_PNT_ID);
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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341