Время прочтения: 3 мин.

Итак, зачем вам индексировать таблицы?

Потому что без индекса SQL-сервер должен сканировать всю таблицу, чтобы найти и вернуть запрошенные данные. Это как с оглавлением в книге: если его нет, то вы дольше будете искать нужный вам материал, перелистывая страницу за страницей. Индексы – отличный помощник в ускорении массивных запросов.

Два основных вида индекса

Существует два основных типа индекса: кластеризованный и некластеризованный индексы.

Кластеризованный индекс видоизменяет индексируемую таблицу: когда вы создаете кластерный индекс для столбца (или ряда столбцов), SQL-сервер сортирует всю таблицу относительно этого столбца (столбцов). Таким образом, индекс находится внутри таблицы. По аналогии такой тип индекса – книга, которая преобразовалась в словарь в алфавитном порядке.

Обратите внимание, что для каждой таблицы можно создать только один кластеризованный индекс, потому что в данном случае индекс – сама таблица.

Чтобы создать кластеризованный индекс, следует воспользоваться следующим запросом:

GO 
-- Создаем таблицу с нужным количеством колонок 
CREATE TABLE [БазаДанных].[Схема].[ИмяТаблицы] 
    ([Столбец1] int NOT NULL, 
     [Столбец2] nchar(10) NULL, 
     [Столбец3] nvarchar(50) NULL); 
GO 
/* Создаем индекс с нужным нам названием (например, "Индекс1") 
    и с нужным количеством колонок в индексе */  
CREATE CLUSTERED INDEX [Индекс1]
    ON [БазаДанных].[Схема].[ИмяТаблицы] ([Столбец1],[Столбец2]);  
GO

С другой стороны, существует некластеризованный индекс. Используя его, вы не видоизменяете таблицу, не превращаете ее в словарь. Вместо этого вы создаете в таблице совершенно другой объект, который содержит столбцы, выбранные для индексации, и указатель на строки таблицы, содержащие данные. Таким образом, данный тип индекса похож на оглавление в книге: оно хранится отдельно от основного текста книги и указывает на какой странице содержится интересующая вас информация.

Для каждой таблицы можно создать несколько некластеризованных индексов.

Чтобы создать некластеризованный индекс, следует воспользоваться следующим запросом:

GO 
-- Создаем таблицу с нужным количеством колонок 
CREATE TABLE [БазаДанных].[Схема].[ИмяТаблицы] 
    ([Столбец1] int NOT NULL, 
     [Столбец2] nchar(10) NULL, 
     [Столбец3] nvarchar(50) NULL); 
GO 
/* Создаем индекс с нужным нам названием (например, "Индекс1") 
    и с нужным количеством колонок в индексе */  
CREATE NONCLUSTERED INDEX [Индекс1]
    ON [БазаДанных].[Схема].[ИмяТаблицы] ([Столбец1],[Столбец2]);  
GO

Преимущества и недостатки двух основных типов индекса

Кластеризованный индексНекластеризованный индекс
Положительные моменты1. Быстро возвращает большой набор данных;
2. Быстро работает для предварительно отсортированных результатов
1. Большие ключи не отражаются на работе других индексов
2. Часто обновляемые ключевые столбцы не отражаются на работе других индексов;
3. Может быть назначен на разные файловые группы;
4. Множество некластеризованных индексов на одну таблицу;
5. Меньший размер, чем у кластеризованного индекса, если включать подмножество столбцов
Отрицательные моменты1. Часто обновляемые ключевые столбцы отражаются на работе некластеризованных индексов;
2. Большие ключи увеличивают размер некластеризованных индексов;
3. Только один кластерный индекс на таблицу
1. Обычно медленнее, чем кластеризованные индексы;
2. Не рекомендуется для возврата больших наборов данных

Таким образом, индексы существуют для ускорения запросов. Есть два основных типа индекса: кластеризованный и некластеризованный. Каждый из них имеет свои преимущества и недостатки, поэтому выбирать индекс следует по ситуации. Иногда требуется использование двух типов индекса одновременно.

Источник