← Назад к вопросам

Назови порядок этапов фильтрации индексами в SQL

2.0 Middle🔥 111 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Общий порядок этапов фильтрации с использованием индексов в SQL

При выполнении запроса с условиями WHERE, SQL-оптимизатор использует индексы для эффективной фильтрации данных. Порядок применения индексов зависит от структуры индекса, типа запроса и конкретной СУБД, но общая последовательность этапов выглядит следующим образом:

1. Доступ к индексу (Index Seek/Index Scan)

Сначала СУБД обращается к индексной структуре для поиска записей, удовлетворяющих условиям:

  • Index Seek — прямой поиск по значению ключа в B-дереве (для точечных условий или диапазонов)
  • Index Scan — полное сканирование индекса (когда Seek невозможен)
-- Пример: Index Seek по индексу на поле id
SELECT * FROM Users WHERE id = 100;

2. Фильтрация по ключевым столбцам индекса

Условия, включающие ключевые столбцы индекса (те, что входят в определение индекса), обрабатываются первыми:

  • Равенства (=)
  • Диапазоны (>, <, BETWEEN)
  • Префиксы строк (LIKE 'ABC%')
-- Индекс на (department_id, salary)
SELECT * FROM Employees 
WHERE department_id = 5 AND salary > 50000;
-- Сначала фильтрация по department_id, затем по salary

3. Использование включенных столбцов (INCLUDE)

Если индекс содержит столбцы в секции INCLUDE, их значения доступны без обращения к таблице:

-- Создание индекса с включенными столбцами
CREATE INDEX idx_cover ON Orders(customer_id) INCLUDE (order_date, total_amount);

-- Запрос может быть выполнен только через индекс
SELECT order_date, total_amount FROM Orders WHERE customer_id = 123;

4. Фильтрация по неключевым столбцам

Если в запросе есть условия по столбцам, не входящим в индекс, происходит:

  • Key Lookup (для кластерных индексов) — переход от индекса к данным таблицы
  • RID Lookup (для некластерных индексов) — поиск по идентификатору строки
-- Индекс только на customer_id, а нужно проверить status
SELECT * FROM Orders 
WHERE customer_id = 123 AND status = 'shipped';
-- Сначала Index Seek по customer_id, затем фильтрация по status

5. Применение предикатов остаточных условий

Оставшиеся условия (сложные выражения, функции) применяются после доступа к данным:

SELECT * FROM Products 
WHERE category_id = 3 
  AND UPPER(name) = 'LAPTOP'; -- UPPER применяется после фильтрации по category_id

6. Агрегация и сортировка (если применимо)

Если запрос содержит GROUP BY или ORDER BY, и индекс поддерживает эти операции:

  • Index Only Scan — когда все данные есть в индексе
  • Использование индекса для сортировки — избежание дорогостоящих операций сортировки
-- Индекс на (category_id, price)
SELECT category_id, AVG(price) 
FROM Products 
GROUP BY category_id 
ORDER BY category_id;
-- Группировка и сортировка могут использовать индекс

Пример комплексного сценария

-- Создаем составной индекс
CREATE INDEX idx_orders ON Orders(order_date, customer_id, status)
INCLUDE (total_amount);

-- Выполняем запрос
SELECT order_date, total_amount 
FROM Orders 
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31'
  AND customer_id IN (100, 200, 300)
  AND status = 'completed'
ORDER BY order_date;

Этапы обработки:

  1. Index Seek по order_date (диапазонное условие)
  2. Фильтрация по customer_id (второй столбец индекса)
  3. Фильтрация по status (третий столбец индекса)
  4. Доступ к total_amount из секции INCLUDE (без обращения к таблице)
  5. Сортировка по order_date уже обеспечена индексом

Ключевые факторы, влияющие на порядок:

  • Селективность условий — более селективные условия применяются раньше
  • Тип индекса — кластерный, некластерный, columnstore
  • Статистика — оптимизатор использует статистику распределения данных
  • Подсказки оптимизаторуFORCE INDEX, INDEX HINT

Важно отметить, что современные СУБД (SQL Server, PostgreSQL, MySQL с InnoDB) часто комбинируют несколько индексов через Index Merge, что может изменять классический порядок обработки. Однако понимание базовой последовательности помогает создавать эффективные индексы и писать оптимизированные запросы.

Назови порядок этапов фильтрации индексами в SQL | PrepBro