Oracle 并行查询、插入效率低问题

本文探讨了在SQL查询中开启并行查询并非总是能提高执行效率的现象,特别是在联查和子查询场景下。如果子查询未开启并行,外层的并行查询可能反而降低效率。示例展示了如何正确地为涉及的每个部分开启并行,以提升整体性能。同时,插入操作的并行执行也需要考虑相同原则,确保并行在插入和选择操作中都被启用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开启并行查询,但是发现开启并行查询反而不如不开启的sql执行效率高..

select
    /*+ parallel(pre, 4) */
    count(1)
from task t
         inner join extract e on t.TASK_ID = e.TASKID
         inner join GRKHXXB_PRE pre on e.extractid = pre.extid
where exists(
              select  1
              from GRBDB_PRE GP
                       inner join KHBDDZB_PRE KP on GP.GRBDH = KP.GRBDH
              where KP.KHBH = pre.KHBH);

原因:如果针对单个表查询,开启并行必然提高效率,但是如果是联查,或者条件中带有子查询。则子查询必须也开启并行,否则会出现外层并行等待内层串行的效果,效果反而不如不开启并行。

以下开启并行有效果:

select /*+ parallel(pre, 4) */
    count(1)
from task t
         inner join extract e on t.TASK_ID = e.TASKID
         inner join GRKHXXB_PRE pre on e.extractid = pre.extid
where exists(
              select /*+ parallel(GP, 4) */ 1
              from GRBDB_PRE GP
                       inner join KHBDDZB_PRE KP on GP.GRBDH = KP.GRBDH
              where KP.KHBH = pre.KHBH);

同理,insert into select开启并行时,insert需要开启并行,后面的select也许要开启并行

开启并行执行insert

insert /*+ append parallel(pre, 2) nologging */ into ${TABLENAME}_PRE pre
   select
       /*+ parallel(imp, 2))*/
      imp.*
   from
      IMPORT_DETAIL id
   inner join IMPORT_LOG il on id.IMPORT_ID = #{IMPORTID} AND id.IMPORT_ID = il.IMPORT_ID
   inner join ${TABLENAME}_IMP imp on imp.IMPORT_LOG_ID = il.IMPORT_LOG_ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值