2010-10-04 3 views
1

Я пытаюсь выполнить следующий оператор в таблице, содержащей 10 000 строк, но запрос выполняется навсегда.Oracle IN Условие очень медленно

delete from Table_A где col1 in ('A', 'B', 'C') и col2 in ('K', 'L', 'M') и col3 in ('H', 'R' , D ')

Пожалуйста, помогите!

Благодаря

ответ

1

Это выглядит так, как будто еще одна сессия заблокирована одна из строк, которые вы хотите удалить.

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

Update:

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

+0

Никто не использует сеанс, и нет никаких незафиксированных транзакций. было просто интересно, есть ли другой способ написать этот запрос? – webdevguy

+2

Практически невозможно, чтобы оператор delete в таблице с 10'000 строк занимал более пяти секунд. Вам нужно предоставить дополнительную информацию: как долго длится «выполнение навсегда»? Есть ли триггеры в этой таблице? Имеет ли таблица огромные значения BLOB или CLOB? У вас есть большое количество индексов? – Codo

1

Другая возможная причина для зависания базы данных - если место назначения архивного архива заполнено. Запросить представления V $ SESSION_WAIT и V $ SESSION_EVENT, чтобы увидеть, что ждет ваш сеанс.

Смежные вопросы