在 Oracle 的合并更新中使用索引
Using index in merge update in 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?
目标是改变计划还是提高绩效?如果您需要读取 table1
中的每一行,table 扫描是一种非常有效的方法。听起来您好像在自反地将 table 扫描等同于性能不佳,但通常情况并非如此 - table 扫描在这些类型的上下文中可能非常有效。
如果 table1( id, updated, data )
上有一个索引并且该索引小于 table(即 table1
中有其他列未参与查询),我猜想优化器也会选择对该索引进行全面扫描。这可能不会生成更高效的查询,但它会删除 table 扫描。
我有这样的查询:
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?
目标是改变计划还是提高绩效?如果您需要读取 table1
中的每一行,table 扫描是一种非常有效的方法。听起来您好像在自反地将 table 扫描等同于性能不佳,但通常情况并非如此 - table 扫描在这些类型的上下文中可能非常有效。
如果 table1( id, updated, data )
上有一个索引并且该索引小于 table(即 table1
中有其他列未参与查询),我猜想优化器也会选择对该索引进行全面扫描。这可能不会生成更高效的查询,但它会删除 table 扫描。