Oracle Index - полное сканирование таблицы

Нашел это здесь:

В общем, рассмотрите возможность создания индекса для столбца в любой из следующих ситуаций:

  • На индексированном столбце или столбцах существует ограничение ссылочной целостности. Индекс - это способ избежать полной блокировки таблицы, которая в противном случае потребовалась бы в случае обновления первичного ключа родительской таблицы, слияния с родительской таблицей или удаления из родительской таблицы.

Я не понимаю, почему в такой ситуации возникает полная блокировка таблицы. Я бы подумал, что если бы я попытался удалить / обновить первичный ключ в родительской таблице, то для дочерней таблицы было бы выполнено полное сканирование таблицы.

Откуда взялся замок?

1 ответ

Решение

Взгляните на эту запись в блоге Тома Кайта. В нем он ссылается на документацию Oracle, где предлагается это объяснение:

  • Предотвращает полную блокировку таблицы на дочернем столе. Вместо этого база данных получает блокировку строки в индексе.
  • Устраняет необходимость полного сканирования дочерней таблицы. В качестве иллюстрации предположим, что пользователь удаляет запись для отдела 10 из таблицы отделов. Если employee.department_id не проиндексирован, то база данных должна сканировать сотрудников, чтобы увидеть, существуют ли какие-либо сотрудники в отделе 10.

В первом сценарии, если столбец не проиндексирован, вся таблица должна быть заблокирована, поскольку Oracle не знает, какие строки необходимо обновить в дочерней таблице. С помощью индекса Oracle может идентифицировать рассматриваемые строки и просто заблокировать их. Без полной блокировки таблицы было бы возможно изменить родительский элемент и заставить другой сеанс изменить дочерний элемент, чтобы он нарушил ограничение.

Другие вопросы по тегам