返回顶部
首页 > 资讯 > 数据库 >Oracle优化:千万级大表逻辑判断的累赘
  • 692
分享到

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

2024-04-02 19:04:59 692人浏览 安东尼
摘要

insert into pntmall_point_detail(PNTMALL_PNT_ID,PNTMALL_PNT_DT,PNTMALL_VALIDITY,PNTMALL_LASTUPDATED

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

您可能感兴趣的文档:

--结束END--

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

本文链接: https://lsjlt.com/news/53007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作