oracle - 在 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
,表扫描是一种非常有效的方法。听起来您将表扫描等同于性能不佳,这通常不是真的——表扫描在这些类型的上下文中可能非常有效。
如果有一个索引table1( id, updated, data )
并且该索引小于表(即table1
查询中不涉及其他列),我猜优化器也会选择对该索引进行全面扫描. 这可能不会生成更有效的查询,但会删除表扫描。
推荐阅读
- vim - 带有键“alt”的字符的快捷方式突然在 VIM 中不再起作用(例如,使用“alt + 3”获得的“#”):改为退出插入模式
- python - 我想将数据透视表的列数据转换为行(取消透视表)
- python - Keras Conv2D CNN - 检查目标时出错 - 预期输出较小
- go - 为什么 Go 没有计算整数绝对值的函数?
- r - 针对 R 包中内部变量的变量名称搜索字符串
- python - 与离散小波变换相比,在连续小波变换中创建相似的频谱图
- xml - 如何在来自 GtkBuilder 的 XML *.ui 文件中使用 GTK+3 GtkImage
- system-verilog - 为什么宏赋值给变量的值会发生变化?
- vim - 如何根据文件类型对不同的命令使用相同的键盘映射?
- python - 熊猫:用从其他数据框中检索到的值替换列值