【问题标题】:Using index in merge update in Oracle在 Oracle 的合并更新中使用索引
【发布时间】:2021-11-25 06:24:29
【问题描述】:

我有这样的查询:

MERGE INTO table1 t1 USING
  (SELECT t2.id ,
          t2.updated ,
          t2.data
   FROM table2 t2) sel ON (sel.id = t1.id
                           AND sel.updated = t1.updated) WHEN MATCHED THEN
UPDATE
SET t1.data = sel.data;

在计划中,我在 table2 上看到 INDEX FULL SCAN,在 table1 上看到 TABLE ACCESS FULL。然后这个表使用 HASH JOIN 连接。两个表都有索引,包括 id、updated 和 data 字段。

有什么办法可以去掉TABLE ACCESS FULL,用更快的方式访问table1?

【问题讨论】:

    标签: oracle performance sql-update sql-merge


    【解决方案1】:

    目标是改变计划还是提高绩效?如果您需要从table1 读取每一行,则表扫描是一种非常有效的方法。听起来您将表扫描等同于性能不佳,这通常不是真的 - 表扫描在这些类型的上下文中可能非常有效。

    如果table1( id, updated, data ) 上有索引并且该索引小于表(即table1 中的其他列不参与查询),我猜优化器会选择对该索引也进行全面扫描。这可能不会生成更有效的查询,但会删除表扫描。

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2018-06-30
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多