Вопрос по sql – Оператор удаления был очень медленным в Oracle

5

У меня есть таблица с около 100k записей, и я хочу удалить некоторые строки, проблема в том, чтоDELETE Оператор работает очень медленно - он не завершился за 30 минут. Ноselect заявление было возвращено в 1 секунду.

SELECT Заявление выглядит следующим образом:

select * from daily_au_by_service_summary 
    where summary_ts >= to_date('09-04-2012','dd-mm-yyyy') 
    order by summary_ts desc;

а такжеDELETE Заявление выглядит следующим образом:

delete from daily_au_by_service_summary 
    where summary_ts > to_date('09-04-2012','dd-mm-yyyy');

Эта таблица имеет единственный индекс вsummary_ts.

Что может быть причиной?

РЕДАКТИРОВАТЬ: таблица была заблокирована многими сессиями:

SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   OBJECT OWNER                   OBJECT_NAME                                                                                                                      OBJECT_TYPE         LOCKED_MODE
---------- ------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------- -----------
       213 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       203 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       202 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       190 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       189 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       188 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       187 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY         

Как убить эти сеансы?

Проблема была решена после того, как я убил сеансы, которые блокируют стол, спасибо всем за помощь. & # X2013;

Как вы определили, что это не закончилось? Возможно, он завершился, но не был зафиксирован, и вы не увидите, что удаление произошло с другого соединения, пока оно не было зафиксировано. Fabian Barney
Я запустил его в консоли sqlplus, он просто не вернулся. так что я думаю, что заявление все еще выполняется. Elvis Lou
Проблема была решена после того, как я убил сеансы, которые блокируют стол, спасибо всем за помощь. Elvis Lou
Убийство сессий это совершенно другая тема. Пожалуйста, задайте новый вопрос (чтобы другим людям было легче найти это решение). Затем добавьте ссылку с этого вопроса на новый. Aaron Digulla

Ваш Ответ

4   ответа
1

что операция удаления займет больше времени, чем выбор, но это не учитывает разницу, которую вы видите.

Похоже, что при удалении запускается дополнительный код, что указывает на то, что в таблице также могут быть триггеры. Вы можете это проверить?

Error: User Rate Limit Exceeded Elvis Lou
3

что после каждой удаленной строки все индексы должны быть обновлены и все ссылки на внешние ключи должны быть проверены. Это может занять очень много времени!

Может быть, это поможет:

Сделайте копию этой таблицы без каких-либо ссылок, триггеров и дополнительных индексов. Затем сделайте это:

insert into new_table (field1, field2, ...) values (
    select field1, field2, ...
    from daily_au_by_service_summary 
    where summary_ts < to_date('09-04-2012','dd-mm-yyyy') 
);

Если поля в таблицах определены в одинаковом порядке, это может также работать:

insert into new_table values (
    select *
    from daily_au_by_service_summary 
    where summary_ts < to_date('09-04-2012','dd-mm-yyyy') 
);

После этого:

truncate daily_au_by_service_summary

а потом:

insert into daily_au_by_service_summary (field1, field2, ...) values (
    select field1, field2, ...
    from new_table; 
);

Новая таблица больше не нужна:

drop new_table;
Error: User Rate Limit Exceeded Elvis Lou
0

создайте новую таблицу с оставшимися строками и удалите предыдущую таблицу вместо удаления.

Я имею в виду,

create table NEW_TABLE as
select * from daily_au_by_service_summary  
where summary_ts <= to_date('09-04-2012','dd-mm-yyyy'); 

Это будет быстрее, особенно если вы удаляете значительное количество строк. (% 10 от общего числа строк, например.)

7

Server load (unlikely because the SELECT is fast) Triggers (see here how to list them for a table). Foreign keys (List of foreign keys and the tables they reference) A lot of data in each row (LOBs, many columns). Someone is locking rows in the table that you'd like to delete (or the whole table). See this blog post how to list locks. This discussion might also help.

Если проблема заключается во внешних ключах, обычным решением является добавление индексов для внешнего столбца: для каждого удаления Oracle необходимо проверять, не нарушит ли это отношение внешнего ключа.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Elvis Lou
Error: User Rate Limit Exceeded Elvis Lou
Error: User Rate Limit Exceeded

Похожие вопросы