У меня есть запрос типа
DELETE from tablename where colname = value;
который занимает очень много времени для выполнения. Что может быть причиной? У меня есть индекс на colname.
У меня есть запрос типа
DELETE from tablename where colname = value;
который занимает очень много времени для выполнения. Что может быть причиной? У меня есть индекс на colname.
Может быть несколько объяснений, почему ваш запрос занимает много времени:
SELECT NULL FROM tablename WHERE colname=:value FOR UPDATE NOWAIT
,ON DELETE TRIGGER
, который выполняет дополнительную работу,UNINDEXED REFERENCE CONSTRAINTS
, указывающую на эту таблицу (есть script из AskTom, который будет помогите вам определить, существуют ли такие неиндексированные внешние ключи).может быть, что ваша таблица связана с несколькими таблицами, имеет огромное количество строк.
Насколько избирательным является этот индекс? Если ваша таблица имеет миллион строк, и это значение составляет сто пятьдесят тысяч из них, ваш индекс бесполезен. На самом деле это может быть хуже, чем бесполезно, если оно действительно используется. Помните, что DELETE - это оператор SELECT: мы можем настроить его путь доступа.
Кроме того, удаление занимает много табличного пространства отмены, поэтому вы можете столкнуться с конфликтом, если система сильно использует. В многопользовательской системе другой сеанс может иметь блокировку строк (строк), которые вы хотите удалить.
У вас есть триггеры DELETE? У вас есть УДАЛИТЬ ограничения внешнего ключа CASCADE?
Изменить: Учитывая все, что вы говорите, и особенно колонка, о которой идет речь, является основным ключом, поэтому вы пытаетесь удалить одну строку, если она занимает много времени, это гораздо более вероятно что какой-то другой процесс или пользователь имеет блокировку в строке. Есть ли что-нибудь в V$LOCK
?
В таблице содержится больше записей?
Есть ли какие-то рекурсивные программы (некоторые вложенные циклы и т.д.), Запущенные на сервере базы данных?
Проверьте сетевые проблемы, если сервер базы данных находится на разных компьютерах?
Если что-то медленное, и вы не знаете, почему, проследите его и узнайте.
Как устранить проблемы с производительностью с помощью инструкции Oracle SQL
Итак, я просто отправлю свой опыт. Может быть полезно для кого-то.
Запрос
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 секунды.