【发布时间】:2008-11-17 16:36:51
【问题描述】:
我们正在处理一个 Oracle 项目中的一个非常缓慢的更新语句。
这里有一个小脚本来重现这个问题:
drop table j_test;
CREATE TABLE J_TEST
(
ID NUMBER(10) PRIMARY KEY,
C1 VARCHAR2(50 BYTE),
C2 VARCHAR2(250 BYTE),
C3 NUMBER(5),
C4 NUMBER(10)
);
-- just insert a bunch of rows
insert into j_test (id)
select rownum
from <dummy_table>
where rownum < 100000;
-- this is the statement that runs forever (longer than my patience allows)
update j_test
set C3 = 1,
C1 = 'NEU';
在某些环境中,更新语句只需要大约 20 秒,而在某些环境中,语句会运行几分钟。当使用更多行时,问题会变得更糟。
我们不知道是什么导致了这种行为,并希望在提出解决方案之前了解正在发生的事情。
有什么想法和建议吗? 谢谢 托尔斯滕
【问题讨论】:
-
"C4 NUMBER(10)" 与 "SET C4 = 'NEU'" 相比让我摸不着头脑。这是有意还是我错过了一个令人兴奋的 Oracle 功能?
-
请考虑不要更新每一行。通过 CTAS(将表创建为选择)执行此操作 - 见下文。
-
对不起,希望我解决了这个问题。