Происшествие с индексом. Ответ
Друзья, всем привет! 👋
С вами Костя Андронов 🙂
В понедельник мы опубликовали пост с интересной ситуацией, которую я показывал на одной из практик курса «Оптимизация 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 | Чатик 💬
Мини-курс Оптимизация: Быстрый старт 🚀