запрос на удаление оракула занимает слишком много времени - PullRequest
25 голосов
/ 25 августа 2009

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

DELETE from tablename where colname = value;

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

Ответы [ 6 ]

31 голосов
/ 25 августа 2009

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

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

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

3 голосов
/ 25 августа 2009

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

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

Есть ли у вас триггеры ON DELETE? Есть ли у вас ограничения внешнего ключа ON DELETE CASCADE?

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

0 голосов
/ 18 августа 2016

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

Запрос

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 сек.

0 голосов
/ 25 августа 2009

Если что-то идет медленно, и вы не знаете почему, отследите это и выясните.

Как устранить проблемы с производительностью с помощью оператора SQL SQL

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...