Oracle truncate table需要长达3亿行表

时间:2017-02-03 14:16:04

标签: oracle performance plsql truncate

有时截断表需要很长时间。 我在PL / SQL过程中使用以下命令。在此之前是否需要我需要的代码,或者包含在下面的语句中以使其更快。我在截断后将记录重新插入到此表中,可能大约为500,000。该表有5个索引,但没有任何触发器。

 EXECUTE IMMEDIATE 'TRUNCATE TABLE act_plus_triggers';

1 个答案:

答案 0 :(得分:1)

@ErsinGülbahar删除的答案可能是正确的 - 表或相关对象可能被某些其他进程锁定。 TRUNCATE是一个DDL命令,其创建速度几乎比常规DELETE快得多。如果命令在几秒钟内没有返回,那么可能会发生一些奇怪的事情。

大多数系统中,阻塞锁定会导致TRUNCATE立即抛出错误消息:

--Run in session #1:
drop table test1;
create table test1(a number);
insert into test1 values(1);
commit;

--Run in session #2:
update test1 set a = 2;
--Do *NOT* commit the results.

--Run in session #1, it will generate:
--ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
truncate table test1;

但是,如果您的会话或系统设置了DDL_LOCK_TIMEOUT,那么会话将等待资源可用。

--Run in session #1.  This will wait either a long time or until the other session commits.
alter session set ddl_lock_timeout = 100000;
truncate table test1;

要解决此问题,请首先查找阻止会话的人员:

select sid, final_blocking_session, gv$session.*
from gv$session
where final_blocking_session is not null;