Oracle Index - полное сканирование таблицы
Нашел это здесь:
В общем, рассмотрите возможность создания индекса для столбца в любой из следующих ситуаций:
- На индексированном столбце или столбцах существует ограничение ссылочной целостности. Индекс - это способ избежать полной блокировки таблицы, которая в противном случае потребовалась бы в случае обновления первичного ключа родительской таблицы, слияния с родительской таблицей или удаления из родительской таблицы.
Я не понимаю, почему в такой ситуации возникает полная блокировка таблицы. Я бы подумал, что если бы я попытался удалить / обновить первичный ключ в родительской таблице, то для дочерней таблицы было бы выполнено полное сканирование таблицы.
Откуда взялся замок?
1 ответ
Взгляните на эту запись в блоге Тома Кайта. В нем он ссылается на документацию Oracle, где предлагается это объяснение:
- Предотвращает полную блокировку таблицы на дочернем столе. Вместо этого база данных получает блокировку строки в индексе.
- Устраняет необходимость полного сканирования дочерней таблицы. В качестве иллюстрации предположим, что пользователь удаляет запись для отдела 10 из таблицы отделов. Если employee.department_id не проиндексирован, то база данных должна сканировать сотрудников, чтобы увидеть, существуют ли какие-либо сотрудники в отделе 10.
В первом сценарии, если столбец не проиндексирован, вся таблица должна быть заблокирована, поскольку Oracle не знает, какие строки необходимо обновить в дочерней таблице. С помощью индекса Oracle может идентифицировать рассматриваемые строки и просто заблокировать их. Без полной блокировки таблицы было бы возможно изменить родительский элемент и заставить другой сеанс изменить дочерний элемент, чтобы он нарушил ограничение.