Как создать индекс в SQL Server?sql-99

Основные понятия об индексах

Индексы в SQL Server - это специальные структуры данных, которые ускоряют выполнение запросов за счет быстрого поиска данных без необходимости полного сканирования таблицы.

Типы индексов в SQL Server

  1. Кластерный индекс (Clustered Index):

    • Определяет физический порядок данных в таблице
    • Только один на таблицу
    • Обычно создается на первичном ключе
  2. Некластерный индекс (Nonclustered Index):

    • Отдельная структура, содержащая ключи и указатели на данные
    • Можно создать несколько на таблицу (до 999 в SQL Server)
  3. Уникальный индекс (Unique Index):

    • Гарантирует уникальность значений в индексируемых столбцах
    • Может быть как кластерным, так и некластерным
  4. Составной индекс (Composite Index):

    • Создается по нескольким столбцам
    • Порядок столбцов важен для эффективности
  5. Индекс с включенными столбцами (Covering Index):

    • Включает дополнительные столбцы помимо ключевых
    • Позволяет избежать обращений к таблице

Синтаксис создания индексов

Базовый синтаксис создания индекса

CREATE INDEX IX_IndexName ON TableName (Column1, Column2, ...);

Создание кластерного индекса

CREATE CLUSTERED INDEX IXC_TableName_Column ON TableName (ColumnName);

Создание уникального индекса

CREATE UNIQUE INDEX IXU_TableName_Column ON TableName (ColumnName);

Создание индекса с включенными столбцами

CREATE INDEX IX_TableName_Column ON TableName (ColumnName)
INCLUDE (Column2, Column3);

Создание фильтрованного индекса

CREATE INDEX IX_Filtered ON TableName (ColumnName)
WHERE ColumnName IS NOT NULL;

Практические примеры

Пример 1: Простой некластерный индекс

CREATE INDEX IX_Employees_LastName ON Employees (LastName);

Пример 2: Составной индекс

CREATE INDEX IX_Employees_NameDepartment ON Employees (LastName, DepartmentID);

Пример 3: Уникальный индекс с включенными столбцами

CREATE UNIQUE INDEX IXU_Employees_Email ON Employees (Email)
INCLUDE (FirstName, LastName);

Параметры создания индексов

  1. FILLFACTOR - определяет процент заполнения страниц индекса
CREATE INDEX IX_Employees_LastName ON Employees (LastName)
WITH (FILLFACTOR = 80);
  1. ONLINE - создание индекса без блокировки таблицы
CREATE INDEX IX_Employees_LastName ON Employees (LastName)
WITH (ONLINE = ON);
  1. WHERE - создание частичного индекса
CREATE INDEX IX_Active_Employees ON Employees (DepartmentID)
WHERE IsActive = 1;

Управление индексами

Просмотр существующих индексов

SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('Employees');

Перестроение индекса

ALTER INDEX IX_Employees_LastName ON Employees REBUILD;

Реорганизация индекса

ALTER INDEX IX_Employees_LastName ON Employees REORGANIZE;

Удаление индекса

DROP INDEX IX_Employees_LastName ON Employees;

Рекомендации по созданию индексов

  1. Индексируйте столбцы, часто используемые в условиях WHERE, JOIN и ORDER BY
  2. Избегайте избыточных индексов - они замедляют операции вставки/обновления
  3. Для часто обновляемых таблиц используйте меньше индексов
  4. Составные индексы должны учитывать порядок использования столбцов в запросах
  5. Используйте включенные столбцы для покрывающих индексов
  6. Мониторьте использование индексов с помощью DMV:
SELECT * FROM sys.dm_db_index_usage_stats;

Резюмируем: создание индексов в SQL Server выполняется командой CREATE INDEX с различными параметрами. Правильно спроектированные индексы значительно ускоряют выполнение запросов, но требуют баланса между производительностью чтения и затратами на обслуживание. Для оптимальной производительности важно выбирать правильные типы индексов, учитывать составные индексы и регулярно обслуживать существующие индексы.