Добавить в корзинуПозвонить
Найти в Дзене
Oracle Developer

Зачем нужен Index Skip Scan? Продолжение

Зачем нужен Index Skip Scan? Продолжение Друзья, всем привет! 👋 С вами Костя Андронов 🙂 В понедельник мы опубликовали вопрос про Index Skip Scan от одного из наших студентов с 6 потока по оптимизации Что такое Index Skip Scan?🤔 Это один из методов доступа к данным через индекс. Обычно он используется, когда в таблице есть составной индекс, но в предикатах запроса отсутствуют лидирующие колонки. Рассмотрим на примере. Пусть у нас есть таблица employees и индекс: create index emp_name_ix on employees(last_name, first_name) Как выглядят листовые блоки этого индекса? В них хранятся все пары last_name, first_name в отсортированном виде, и для каждой — rowid строки. Пример: ... 'Ivanov', 'Alexander' - 'AAAR2TAAUAAAADtAAD' 'Ivanov', 'Michail' - 'AAAR2TAAUAAAADtAAz' ... 'Petrov', 'Alexander' - 'AAAR2TAAUAAAADtAAF' 'Petrov', 'Petr' - 'AAAR2TAAUAAAADtABB' ... А теперь вопрос: как получить только те строки, где first_name = 'Alexander'? Есть два пути: 🔹 Прочитать весь индекс и отобра

Зачем нужен Index Skip Scan? Продолжение

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

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

В понедельник мы опубликовали вопрос про Index Skip Scan от одного из наших студентов с 6 потока по оптимизации

Что такое Index Skip Scan?🤔

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

Рассмотрим на примере. Пусть у нас есть таблица employees и индекс:

create index emp_name_ix on employees(last_name, first_name)

Как выглядят листовые блоки этого индекса?

В них хранятся все пары last_name, first_name в отсортированном виде, и для каждой — rowid строки. Пример:

...

'Ivanov', 'Alexander' - 'AAAR2TAAUAAAADtAAD'

'Ivanov', 'Michail' - 'AAAR2TAAUAAAADtAAz'

...

'Petrov', 'Alexander' - 'AAAR2TAAUAAAADtAAF'

'Petrov', 'Petr' - 'AAAR2TAAUAAAADtABB'

...

А теперь вопрос: как получить только те строки, где first_name = 'Alexander'?

Есть два пути:

🔹 Прочитать весь индекс и отобрать нужное.

🔹 Перебирать возможные значения last_name, подставлять их в комбинации и искать пары (last_name, first_name) — то есть ключ индекса.

И вот второй вариант как раз и называется Index Skip Scan. Подробнее — в этом посте.

В чем же проблемы такого подхода?

Всё зависит от количества строк и уникальных значений в last_name.

🔸 Если уникальных значений немного — Skip Scan может быть выгодным.

🔸 Если их много — придётся выполнять массу сканирований индекса, и тут уже проще прочитать весь индекс или даже таблицу.

А в чем подвох?⚡️

Чтобы составной индекс работал эффективнее, лидирующие колонки должны быть высококардинальными. Другими словами уникальных значений last_name обычно очень много — и тогда появление Index Skip Scan в плане превращается в «узкое горлышко» в плане запроса

Для тех кто хочет разобраться в нюансах оптимизации и не знает с чего начать - Анкета предзаписи на 7 поток по оптимизации

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

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

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

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

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