Oracle声明挂起

时间:2014-10-06 08:05:01

标签: sql oracle sqlplus

我有一个非常简单的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小时后,我们中止了执行。

这种行为的原因是什么?我该怎么做才能找到问题的根源?我绝对没有线索!

1 个答案:

答案 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提示。