【发布时间】: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 有一个工具可以让您查看会话的进展情况。