【问题标题】:Oracle 11g - How to speed up parallel insert with join on three tables [duplicate]Oracle 11g - 如何通过三个表的连接来加速并行插入[重复]
【发布时间】:2013-12-02 15:14:35
【问题描述】:

我们想加快下面的插入语句。目前大约需要 1 个多小时才能完成。

PM 表包含大约 79M 记录,F1 包含 4.8M 记录,RESULT 包含 80M 记录。

有什么想法可以加快速度吗?

insert /*+ PARALLEL(16) APPEND NOLOGGING */ into MATCH_DATE(ID1, ID2)
select /*+ PARALLEL(16) */ T1.ID ID1, T2.ID ID2
from PM T1, F1 T2, RESULT
where  RESULT.RECON_PM_ID = T1.ID
    and RESULT.STATUS in (:ZERO, :TWO)
    and RESULT.RECON_CONFIG_ID = :RECON_CONFIG_ID
    and T1.UPLOAD_DT >= sysdate - :ONE
    and RESULT.CREATE_DT >= sysdate - :SIXTY
    and RESULT.RECON_F1_ID is null
    and T2.STATUS = :ZERO
    and T2.UPLOAD_DT >= sysdate - :ONE
    and T1.TRAN_DT between T2.TRAN_DT - :ASDF
and T2.TRAN_DT + :ASDF
and T1.CHARGING_NO = T2.CHARGING_NO 
and T1.USAGE_TYPE = T2.USAGE_TYPE 

这是来自企业管理器的执行统计数据:

【问题讨论】:

  • PM 表上有哪些索引?有趣的是,它执行 78M 的 INDEX UNIQUE SCAN,然后在检索 82M 的同一个表上执行 TABLE ACCESS BY GLOBAL - 这意味着它可能值得在 PM 上创建一个涵盖所有所需字段的索引。事实上,值得在所有涉及的表上发布索引。
  • 这和你的last question非常相似;答案几乎相同。您选择了几乎 100% 的所有表,但您使用的是嵌套循环和一些索引扫描。作为jonearles suggested;更新您的统计信息,以便您使用散列连接(并希望完全扫描表)并使用语句级别而不是对象级别并行。

标签: sql performance oracle parallel-processing oracle11g


【解决方案1】:

当您在同一个表上有多个谓词时,常规表统计信息的价值有限,因此请确保正在调用优化器动态采样。一个常规的解释计划会告诉你,默认情况下我相信 11g 会对该查询调用动态采样,但如果不是,那么预期的基数将不准确。

我也会避免在这样的查询中使用绑定变量——变量值的变化可能意味着完全不同的计划将是有益的,并且在多分钟查询的上下文中硬解析时间不会是一个重大问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多