【问题标题】:Oracle statement hangingOracle 语句挂起
【发布时间】:2014-10-06 08:05:00
【问题描述】:

我有一个在 Oracle 10g 数据库上执行的非常简单的 SQL 语句。它将一些数据从一个模式移动到另一个模式:

CREATE TABLE TARGET.BIG_TABLE AS SELECT * FROM SOURCE.BIG_TABLE
WHERE (COLUMN1, COLUMN2) IN (SELECT COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE);

TARGET.HELP_TABLE 中有一个针对 COLUMN1 和 COLUMN2 的唯一约束。在 SOURCE.BIG_TABLE 中只有一个组合主键(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)。

语句本身没有问题,因为它在类似的测试环境中测试时已经执行了多次。

但是,在实际环境中,此语句在大约 3 小时后没有任何 I/O 活动。 8 小时后,我们中止了执行。

这种行为的原因可能是什么?我该怎么做才能找到问题的根源?我绝对不知道!

【问题讨论】:

  • 是否被未提交的事务锁定?
  • 理论上,这是不可能的。在执行该语句之前,将事务处理到源模式中的所有进程都将关闭。但是,是否有可能了解语句为何挂起或等待的原因?
  • 查询可能需要很长时间。生产环境中EXPLAIN PLANresult of your select query检查了吗
  • HELP_TABLE 中大约有多少行?在 SOURCE.BIG_TABLE 中?您希望选择其中多少行?如果只运行 SELECT 会发生什么?
  • 我不熟悉执行此操作的“正确”方法,但 Toad 有一个工具可以让您查看会话的进展情况。

标签: sql oracle sqlplus


【解决方案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 提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多