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