Время прочтения: 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. Не рекомендуется для возврата больших наборов данных |
Таким образом, индексы существуют для ускорения запросов. Есть два основных типа индекса: кластеризованный и некластеризованный. Каждый из них имеет свои преимущества и недостатки, поэтому выбирать индекс следует по ситуации. Иногда требуется использование двух типов индекса одновременно.