我有一个非常简单的SQL语句,它在Oracle 10g数据库上执行。它将一些数据从一个模式移动到另一个模式:
CREATE TABLE TARGET.BIG_TABLE AS SELECT * FROM SOURCE.BIG_TABLE
WHERE (COLUMN1, COLUMN2) IN (SELECT COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE);
对于COLUMN1和COLUMN2,TARGET.HELP_TABLE中有一个唯一约束。在SOURCE.BIG_TABLE中,只有一个组合主键(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)。
语句本身没有问题,因为在类似的测试环境中测试时已经执行了几次。
但是,在真实环境中,此声明在大约3小时后没有任何I / O活动。 8小时后,我们中止了执行。
这种行为的原因是什么?我该怎么做才能找到问题的根源?我绝对没有线索!
答案 0 :(得分:1)
尝试摆脱解释计划中的嵌套循环。考虑使用内连接重写查询:
SELECT /*+ use_hash(a b) */
a.*
FROM SOURCE.BIG_TABLE a
inner join (SELECT distinct COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE) b
on b.COLUMN1 = a.COLUMN1
and b.COLUMN2 = a.COLUMN2;
还要考虑使用use_hash
提示。选择所有行时不应使用索引(除非可以使用索引快速完全扫描返回help_table中的column1和column2)。仅在存在重复时才在内部查询中使用distinct
。
考虑添加parallel
提示。