2017-02-03 9 views
2

Иногда таблица усечений занимает много времени. У меня есть следующая команда с процедурой PL/SQL. Есть ли какой-либо код, который мне нужен до этого, или для включения в приведенный ниже оператор, чтобы сделать это быстрее. Я повторно вставляю записи в эту таблицу после усечения, которая может быть около 500 000. Таблица имеет 5 индексов, но не имеет триггеров.Таблица обрезания Oracle занимает много времени для 300 миллионов строк таблицы

EXECUTE IMMEDIATE 'TRUNCATE TABLE act_plus_triggers'; 
+1

Попробуйте 'TRUNCATE TABLE DROP act_plus_triggers STORAGE' - это его быстрее? –

+2

Я никогда не знал, что TRUCATE займет больше нескольких секунд. возможно, у вас есть замок на столе, и он ждет, когда блокировка будет выпущена. – BriteSponge

+0

Как вы знаете, что это утверждение занимает много времени? Получаете ли вы ** когда-либо ** длительное время выполнения, чтобы усечь, если вы выполняете 'truncate table ...' ** непосредственно в базе данных ** (через SQL \ * Plus, SQL Developer, Toad и т. Д.)? Как вы знаете, что это не что-то еще в коде PL/SQL, что занимает много времени? – mathguy

ответ

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^