Найти в Дзене
Oracle Developer

Происшествие с индексом

Происшествие с индексом. Ответ

Друзья, всем привет! 👋

С вами Костя Андронов 🙂

В понедельник мы опубликовали пост с интересной ситуацией, которую я показывал на одной из практик курса «Оптимизация Oracle SQL».

Несмотря на идеальные условия для применения индекса (селективность предиката — всего 1,6%), Oracle выбирает Table Access Full вместо Index Range Scan 😱

Разбираемся, почему это произошло.

📌 Как Oracle выбирает метод доступа к данным?

На этапе hard-parse оптимизатор строит планы с разными методами доступа и оценивает их «стоимость» для конкретного запроса.

Получается, он решил, что обойти всю таблицу «дешевле», чем использовать индекс. Но почему? 🤔

Чтобы понять это, надо заглянуть в статистику объектов — таблицы и индекса.

🔍 Clustering Factor

Это один из ключевых параметров индекса. Он показывает, насколько упорядочены данные в таблице относительно порядка в индексе (в индексе они всегда отсортированы).

Как его интерпретировать?

📦 Листовые блоки индекса содержат ключи и rowid соответствующих строк.

Если при чтении индекса каждый новый rowid будет указывать на другой блок таблицы — значит, данные не упорядочены.

📈 Clustering Factor в таком случае будет большим — а это сигнал для оптимизатора, что доступ по индексу приведёт к хаотичному чтению блоков.

🧠 Почему это может быть неэффективно?

Oracle работает с блоками данных, а не с отдельными строками.

И если даже небольшой процент строк попадает под условие запроса, но все они разбросаны по разным блокам, то:

🔹 Нужно будет читать почти все блоки таблицы,

🔹 Плюс часть блоков самого индекса,

🔹 И в сумме Index Range Scan может оказаться «дороже», чем простое Table Access Full.

🎥 В видео к этому посту мы подробно разбираем пример такого поведения на одной из встреч 6 потока курса по оптимизации и обсуждаем, что с этим делать.

Хочешь научиться разбираться в таких нюансах сам?

👉 Записывайся на 7 поток по оптимизации: Анкета. 📋

Обсудить нюансы использования индексов и оптимизации в Oracle - велком в Чатик 💬

С вами был Костя Андронов. Всем отличного дня и приятного просмотра! 🚀

#oracle #оптимизация #index #sql #Konstantin_Andronov

Канал Oracle Developer | Чатик 💬

Мини-курс Оптимизация: Быстрый старт 🚀

Анкета предзаписи на 7 поток "Оптимизация Oracle SQL"