@ удален ответ 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;
Попробуйте 'TRUNCATE TABLE DROP act_plus_triggers STORAGE' - это его быстрее? –
Я никогда не знал, что TRUCATE займет больше нескольких секунд. возможно, у вас есть замок на столе, и он ждет, когда блокировка будет выпущена. – BriteSponge
Как вы знаете, что это утверждение занимает много времени? Получаете ли вы ** когда-либо ** длительное время выполнения, чтобы усечь, если вы выполняете 'truncate table ...' ** непосредственно в базе данных ** (через SQL \ * Plus, SQL Developer, Toad и т. Д.)? Как вы знаете, что это не что-то еще в коде PL/SQL, что занимает много времени? – mathguy