В чем разница между кластерным и некластерным индексом?sql-94

Кластерный и некластерный индексы — это принципиально разные структуры организации данных в SQL Server, каждый со своей спецификой и оптимальными сценариями использования.

Кластерный индекс

Определение

Кластерный индекс определяет физический порядок данных в таблице. Таблица может иметь только один кластерный индекс, так как данные не могут быть физически отсортированы более чем одним способом.

Особенности

  • Структура данных: Сама таблица становится B-деревом
  • Хранение: Листовые узлы содержат фактические данные строки
  • Первичный ключ: По умолчанию создается как кластерный индекс
  • Производительность: Быстрее для операций диапазонного сканирования

Пример создания

CREATE CLUSTERED INDEX IX_Orders_OrderDate
ON Orders(OrderDate)

Некластерный индекс

Определение

Некластерный индекс — это отдельная структура, которая хранит копию части данных таблицы с указателем на физическое расположение данных.

Особенности

  • Количество: Можно создать до 999 некластерных индексов на таблицу
  • Структура: Листовые узлы содержат ключ кластеризации или RID
  • Дополнительное хранилище: Требует места для своей структуры
  • Оптимизация: Эффективен для точечных запросов

Пример создания

CREATE NONCLUSTERED INDEX IX_Orders_CustomerID
ON Orders(CustomerID)
INCLUDE (OrderAmount)

Ключевые различия

ХарактеристикаКластерный индексНекластерный индекс
Количество1 на таблицуДо 999 на таблицу
Физическое упорядочениеДаНет
Скорость чтенияБыстрее для диапазоновБыстрее для точечных запросов
Скорость вставкиМедленнее (переупорядочивание)Быстрее
Хранение данныхСодержит всю строкуСодержит ключ + указатель

Оптимальные сценарии использования

Кластерный индекс лучше для:

  1. Столбцов, часто используемых в диапазонных запросах (BETWEEN, >, <)
  2. Столбцов, которые монотонно увеличиваются (IDENTITY)
  3. Часто используемых в ORDER BY или GROUP BY

Некластерный индекс лучше для:

  1. Столбцов в условиях WHERE для точечного поиска
  2. Покрывающих индексов (INCLUDE)
  3. Столбцов с высокой селективностью

Взаимодействие индексов

  1. Некластерный индекс содержит ключ кластерного:

    • Если кластерный индекс существует
    • Иначе содержит RID (указатель на физическую строку)
  2. Покрывающий запрос:

    -- Использует INCLUDE для избежания key lookup
    CREATE NONCLUSTERED INDEX IX_Covering
    ON Orders(CustomerID)
    INCLUDE (OrderDate, Amount)
    

Влияние на производительность

  1. Вставка данных:

    • Кластерный: может вызывать page splits
    • Некластерный: дополнительные операции записи
  2. Обновление ключевых столбцов:

    • Кластерный: очень дорогостоящая операция
    • Некластерный: менее затратно

Рекомендации по проектированию

  1. Всегда создавайте кластерный индекс:

    • Heap-таблицы (без кластерного индекса) неэффективны
  2. Выбирайте узкий кластерный ключ:

    • Он включается во все некластерные индексы
  3. Используйте INCLUDE для покрывающих индексов

  4. Мониторьте использование индексов:

    SELECT * FROM sys.dm_db_index_usage_stats
    

Резюмируем

Кластерный и некластерный индексы решают разные задачи оптимизации производительности. Кластерный индекс определяет физическое хранение данных и идеален для диапазонных запросов, тогда как некластерные индексы служат для ускорения поиска по конкретным значениям. Грамотная комбинация обоих типов индексов — основа высокой производительности базы данных.