首页 > 解决方案 > 在 Oracle 的合并更新中使用索引

问题描述

我有这样的查询:

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?

标签: oracleperformancesql-updatesql-merge

解决方案


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

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


推荐阅读