Источники информации об индексах
Обозреватель объектов SQL Server Management Studio
Представления каталога
Представление каталога | Отображение сведений о |
sys.indexes | Тип индекса, идентификатор файловой группы или схемы секционирования, а также текущие параметры индекса, хранящиеся в метаданных. |
sys.index_columns | Идентификатор столбца, положение в индексе, тип (ключевой или неключевой) и порядок сортировки (ASC или DESC). |
sys.stats | Статистика, связанная с индексом, включая имя статистики, а также то, была ли она создана автоматически или пользователем. |
sys.stats_columns | Идентификатор столбца, связанного со статистикой. |
sys.xml_indexes | Тип XML-индекса (первичный или вторичный), тип и описание вторичного индекса. |
Функции работы с индексами
Функция | Отображение сведений о |
sys.dm_db_index_physical_stats | Размер и статистика фрагментации индекса. |
sys.dm_db_index_operational_stats | Статистика операций ввода-вывода текущего индекса и таблицы. |
sys.dm_db_index_usage_stats | Статистика использования индекса запросами определенного типа. |
sys.dm_db_missing_index_columns | Сведения о столбцах таблиц базы данных, для которых отсутствуют индексы. |
sys.dm_db_missing_index_details | Подробные сведения об отсутствующих индексах. |
sys.dm_db_missing_index_group_stats | Сводные данные о группах отсутствующих индексов. |
sys.dm_db_missing_index_groups | Данные о том, какие отсутствующие индексы содержались в указанной группе. |
INDEXKEY_PROPERTY | Положение индексного столбца в индексе и порядок сортировки столбца (ASC или DESC). |
INDEXPROPERTY | Тип индекса, количество уровней и текущие параметры индекса, хранящиеся в метаданных. |
INDEX_COL | Имя ключевого столбца указанного индекса. |
Создание индексов
Создание индексов осуществляется командой CREATE INDEX.
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { filegroup_name | default } ]
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
}
<relational_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
}
UNIQUE
Создает уникальный индекс для таблицы или представления. Уникальным является индекс, в котором не может быть двух строк с одним и тем же значением ключа индекса. Кластеризованный индекс представления должен быть уникальным.
Компонент Database Engine не позволяет создать уникальный индекс по столбцам, уже содержащим повторяющиеся значения, даже если параметру IGNORE_DUP_KEY присвоено значение ON. При попытке создания такого индекса компонент Database Engine выдает сообщение об ошибке. Прежде чем создавать уникальный индекс по такому столбцу или столбцам, необходимо удалить все повторяющиеся значения. Столбцы, используемые в уникальном индексе, должны иметь свойство NOT NULL, т. к. при создании индекса значения NULL рассматриваются как повторяющиеся.
CLUSTERED
Создает кластеризованный индекс, при создании кластеризованного индекса все существующие некластеризованные индексы таблицы перестраиваются. Если аргумент CLUSTERED не указан, создается некластеризованный индекс.
NONCLUSTERED
Создание индекса, задающего логическое упорядочение для таблицы. Логический порядок строк в некластеризованном индексе не влияет на их физический порядок.
Для индексированных представлений некластеризованные индексы могут создаваться только в случае, если уже определен уникальный кластеризованный индекс.
По умолчанию, используется значение NONCLUSTERED.
index_name
Имя индекса. Имена индексов должны быть уникальными в пределах таблицы или представления, но необязательно должны быть уникальными в пределах базы данных.
column
Столбец или столбцы, на которых основан индекс. Имена одного или нескольких столбцов для создания комбинированного индекса. Столбцы, которые должны быть включены в составной индекс, указываются в скобках за аргументом table_or_view_name в порядке сортировки.
Столбцы с типами данных для больших объектов ntext, text, varchar(max),nvarchar(max), varbinary(max), xml или image не могут быть ключевыми столбцами для индекса. Кроме того, определение представления не может включать столбцы типов ntext, text и image, даже если они указаны в инструкции CREATE INDEX.
[ ASC | DESC ]
Определяет сортировку значений заданного столбца индекса: по возрастанию или по убыванию. Значение по умолчанию - ASC.
INCLUDE (column[ ,... n ])
Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного индекса. Некластеризованный индекс может быть уникальным или неуникальным.
WHERE <filter_predicate>
Отфильтрованный индекс является оптимизированным некластеризованным индексом, предназначенным для запросов, выбирающих небольшой процент строк таблицы. Чтобы проиндексировать часть данных таблицы, в нем используется предикат фильтра. Правильно составленный отфильтрованный индекс может увеличить скорость выполнения запроса, уменьшить стоимость хранения и обслуживания.
Предикат фильтра использует простую логику сравнения и не может ссылаться на вычисляемый столбец, столбец определяемого пользователем типа, столбец пространственного типа данных или столбец типа hierarchyID. Сравнения с помощью литералов NULL с операторами сравнения недопустимы. Вместо этого используются операторы IS NULL и IS NOT NULL.
При создании и использовании отфильтрованных индексов обязательно должны быть установлены следующие значения параметров.
Параметры SET | Обязательное значение |
ANSI_NULLS | ON |
ANSI_PADDING | ON |
ANSI_WARNINGS | ON |
ARITHABORT | ON |
CONCAT_NULL_YIELDS_NULL | ON |
NUMERIC_ROUNDABORT | OFF |
QUOTED_IDENTIFIER | ON |
ON filegroup_name
Создает заданный индекс в указанной файловой группе. Если местоположение не указано и таблица или представление не секционированы, индекс использует ту же файловую группу, что и базовая таблица или базовое представление. Файловая группа должна существовать.
ON "default"
Создает заданный индекс в файловой группе, используемой по умолчанию.
<object>::=
Полное или неполное имя индексируемого объекта.
<relational_index_option>::=
Указывает параметры, которые могут использоваться при создании индекса.
PAD_INDEX = { ON | OFF }
Определяет разреженность индекса. Значение по умолчанию — OFF.
ON
Процент свободного места, определяемый аргументом fillfactor, применяется к страницам индекса промежуточного уровня.
OFF или fillfactor не указан
Страницы промежуточного уровня заполняются почти полностью, при этом остается достаточно места по крайней мере для одной строки максимального размера, возможного в этом индексе при заданном наборе ключей на промежуточных страницах.
Параметр PAD_INDEX имеет смысл только в случае, если указан параметр FILLFACTOR, так как использует процентное значение, указанное в нем. Если процент, заданный аргументом FILLFACTOR, недостаточно велик для размещения одной строки, компонент Database Engine внутренне переопределит это значение, чтобы обеспечить минимум. Количество строк на странице индекса промежуточного уровня никогда не бывает менее двух даже при самых малых значениях аргумента fillfactor.
Для обратной совместимости синтаксиса аргумент WITH PAD_INDEX эквивалентен аргументу WITH PAD_INDEX = ON.
FILLFACTOR =fillfactor
Указывает значение в процентах, показывающее, насколько полным компонент Database Engine должен сделать конечный уровень каждой страницы индекса во время создания или перестроения индекса. Параметр fillfactor должен быть целым числом от 1 до 100. Значение по умолчанию равно 0. Если параметр fillfactor равен 100 или 0, компонент Database Engine создает индексы с полностью заполненными страницами конечного уровня.
Аргумент FILLFACTOR действует только при создании или перестройке индекса. Компонент Database Engine не сохраняет динамически указанный процентный объем свободного места на страницах. Значение коэффициента заполнения можно увидеть в представлении каталога sys.indexes.
SORT_IN_TEMPDB = { ON | OFF }
Указывает, сохранять ли временные результаты сортировки в базе данных tempdb. Значение по умолчанию - OFF.
ON
Промежуточные результаты сортировки, которые используются при индексировании, хранятся в базе данных tempdb. Это может уменьшить время, необходимое для создания индекса, если база данных tempdb и база данных пользователя находятся на разных наборах дисков. Однако это увеличивает использование места на диске, которое используется при индексировании.
OFF
Промежуточные результаты сортировки хранятся в той же базе данных, где и индекс.
IGNORE_DUP_KEY = { ON | OFF }
Определяет ответ на ошибку, случающуюся, когда операция вставки пытается вставить в уникальный индекс повторяющиеся значения ключа. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса. Значение по умолчанию - OFF.
ON
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится предупреждающее сообщение. С ошибкой завершаются только строки, нарушающие ограничение уникальности.
OFF
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится сообщение об ошибке. Будет выполнен откат всей операции INSERT.
STATISTICS_NORECOMPUTE = { ON | OFF }
Указывает, будет ли выполняться автоматический перерасчет статистики распределения. Значение по умолчанию - OFF.
ON
Устаревшие статистики не пересчитываются автоматически.
OFF
Автоматическое обновление статистических данных включено.
DROP_EXISTING = { ON | OFF }
Указывает, что названный существующий кластеризованный или некластеризованный индекс удаляется и перестраивается. Значение по умолчанию - OFF.
ON
Существующий индекс удаляется и перестраивается. Указанное имя индекса должно совпадать с уже существующим индексом, но определение индекса может быть изменено. Например, можно указать другие столбцы, порядок сортировки, схему секционирования или параметры индекса.
OFF
Выдается ошибка, если индекс с указанным именем уже существует.
Тип индекса не может быть изменен с помощью аргумента DROP_EXISTING.
ONLINE = { ON | OFF }
Определяет, будут ли базовые таблицы и связанные индексы доступны для запросов и изменения данных во время операций с индексами (только в выпусках SQL Server Enterprise и Developer). Значение по умолчанию - OFF.
ALLOW_ROW_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка строк. Значение по умолчанию — ON.
ON
Блокировки строк допустимы при доступе к индексу. Необходимость в блокировке строк определяет компонент Database Engine.
OFF
Блокировки строк не используются.
ALLOW_PAGE_LOCKS = { ON | OFF }
Указывает, разрешена ли блокировка страниц. Значение по умолчанию - ON.
ON -блокировки страниц возможны при доступе к индексу. Необходимость в блокировке страниц определяет компонент Database Engine.
OFF -блокировки страниц не используются.
MAXDOP = max_degree_of_parallelism
MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов. Параллельные операции с индексами доступны только в редакциях Developer, Enterprise и DataCenter. Максимальное число процессоров завис от редакции (Enterprise – 64, DataCenter – 256). Значение по умолчанию 0 - в зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.
Вычисляемые столбцы
Индексы могут создаваться на вычисляемых столбцах. Вычисляемые столбцы могут иметь свойство PERSISTED - это значит, что компонент Database Engine хранит вычисленные значения в таблице и обновляет их при обновлении любых столбцов, от которых зависит вычисляемый столбец. Компонент Database Engine использует эти сохраняемые значения, когда создает индекс по столбцу и когда запрос обращается к индексу.
Для индексации вычисляемого столбца этот вычисляемый столбец должен быть детерминированным и точным. Детерминированные выражения каждый раз возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. Недетерминированные выражения могут возвращать каждый раз разные результаты, даже если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. К точным типам относятся точные числовые типы (целочисленные и десятичные), денежные типы, символьные строки и другие точные типы, перечисленные в модуле 3.
Для материализованных вычисляемых столбцов необходимо, чтобы следующие параметры SET имели значения, указанные выше в разделе «Обязательные параметры SET для индексированных представлений».
Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max), nvarchar(max), varbinary(max) и xml, могут индексироваться как ключевые или включенные неключевые столбцы, если тип данных вычисляемого столбца приемлем как тип данных для ключевого столбца индекса или неключевого столбца. Если размер ключа индекса превышает 900 байт, выдается предупреждение.
Создание индекса на вычисляемом столбце может привести к ошибке в операциях вставки или обновления, которые до этого успешно выполнялись. Такое неудачное завершение возможно, если вычисляемый столбец вызывает арифметическую ошибку. Например, вычисляемый столбец"c" в следующей таблице вызывает арифметическую ошибку, но инструкция INSERT работает.
CREATE TABLE T (a int, b int, c AS a/b);INSERT INTO T VALUES (1, 0);Если же после создания таблицы создать индекс на вычисляемом столбце "c", та же инструкция INSERT будет заканчиваться ошибкой.
CREATE TABLE T (a int, b int, c AS a/b);CREATE UNIQUE CLUSTERED INDEX IdxT ON T(c);INSERT INTO T VALUES (1, 0);Примеры: