У меня есть запрос типа
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 секунды.