Подтвердить что ты не робот

Запрос удаления оракула занимает слишком много времени

У меня есть запрос типа

DELETE from tablename where colname = value;

который занимает очень много времени для выполнения. Что может быть причиной? У меня есть индекс на colname.

4b9b3361

Ответ 1

Может быть несколько объяснений, почему ваш запрос занимает много времени:

  • Вы можете быть заблокированы другой сессией (скорее всего). Прежде чем удалять, вы должны убедиться, что никто не блокирует строки, например: issue SELECT NULL FROM tablename WHERE colname=:value FOR UPDATE NOWAIT,
  • Может быть ON DELETE TRIGGER, который выполняет дополнительную работу,
  • Отметьте UNINDEXED REFERENCE CONSTRAINTS, указывающую на эту таблицу (есть script из AskTom, который будет помогите вам определить, существуют ли такие неиндексированные внешние ключи).

Ответ 2

может быть, что ваша таблица связана с несколькими таблицами, имеет огромное количество строк.

Ответ 3

Насколько избирательным является этот индекс? Если ваша таблица имеет миллион строк, и это значение составляет сто пятьдесят тысяч из них, ваш индекс бесполезен. На самом деле это может быть хуже, чем бесполезно, если оно действительно используется. Помните, что DELETE - это оператор SELECT: мы можем настроить его путь доступа.

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

У вас есть триггеры DELETE? У вас есть УДАЛИТЬ ограничения внешнего ключа CASCADE?

Изменить: Учитывая все, что вы говорите, и особенно колонка, о которой идет речь, является основным ключом, поэтому вы пытаетесь удалить одну строку, если она занимает много времени, это гораздо более вероятно что какой-то другой процесс или пользователь имеет блокировку в строке. Есть ли что-нибудь в V$LOCK?

Ответ 4

В таблице содержится больше записей? Есть ли какие-то рекурсивные программы (некоторые вложенные циклы и т.д.), Запущенные на сервере базы данных?
Проверьте сетевые проблемы, если сервер базы данных находится на разных компьютерах?

Ответ 6

Итак, я просто отправлю свой опыт. Может быть полезно для кого-то.

Запрос

delete from foo
where foo_id not in ( 
  select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);

занял 16 сек. удаляя 1700 записей из 2300 всего в таблице foo.

Я проверил все индексы на внешних ключах, как указано в других ответах. Это не помогло.

Решение:

Изменен запрос на

delete from foo
where foo_id in ( 
  select foo_id from foo
  minus
  select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);

Я изменил not in на in и использовал minus для достижения правильного результата.

Теперь запрос выполняется за 0,04 секунды.