Максимальный размер ключей индекса

При проектировании индекса, содержащего множество ключевых столбцов или столбцов большого размера, следует вычислить размер ключа индекса, чтобы удостовериться, что он не превысит максимальный. В SQL Server сохраняется предел в 900 байт на максимальный общий размер всех ключевых столбцов индекса. При этом исключаются неключевые столбцы, входящие в определение некластеризованных индексов.

Вычисление размера ключа индекса

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

  1. Отобразите свойства столбцов таблицы, на которой будет основан индекс. Это можно сделать с помощью представления каталога sys.columns.

  2. Вычислите сумму длин всех столбцов, которые будут определены в ключе индекса.

    Например, следующая инструкция вычисляет столбец max_length представления каталога sys.columns для указанных столбцов таблицы Person.Address.

    USE AdventureWorks2008R2;
    GO
    SELECT SUM(max_length)AS TotalIndexKeySize
    FROM sys.columns
    WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode')
    AND object_id = OBJECT_ID(N'Person.Address');
    
    ПримечаниеПримечание

    Если столбец таблицы принадлежит к типу данных Юникода, например nchar или nvarchar, отображаемая длина столбца представляет собой величину, необходимую для хранения его символов. Она в два раза превышает число символов, указанных в инструкции CREATE TABLE. В предыдущем примере столбец City определен как принадлежащий типу данных nvarchar(30); поэтому длина, необходимая для хранения символов столбца, равна 60 байт.

  3. Если общая длина столбцов меньше 900 байт, они могут выступать в качестве ключевых столбцов индекса. Если общая длина столбцов превышает 900 байт, следует учитывать приведенные ниже сведения.

    В инструкции CREATE INDEX используются следующие алгоритмы для вычисления размера ключа индекса.

    • Если размер всех фиксированных ключевых столбцов плюс максимальный размер всех переменных ключевых столбцов, указанных в инструкции CREATE INDEX, меньше 900 байт, инструкция CREATE INDEX завершается успешно без предупреждений и ошибок.

    • Если размер всех фиксированных ключевых столбцов плюс максимальный размер всех переменных ключевых столбцов превышает 900, но размер всех фиксированных ключевых столбцов плюс минимальный размер переменных ключевых столбцов меньше 900, инструкция CREATE INDEX выполняется успешно с предупреждением о том, что последующие инструкции INSERT или UPDATE могут завершиться ошибкой, если в них будут указаны значения, создающие значение ключа больше 900 байт. Инструкция CREATE INDEX завершается ошибкой, если существующие строки данных таблицы имеют значения, создающие ключ больше 900 байт. Последующие инструкции INSERT или UPDATE, в которых задаются значения данных, создающие значение ключа длиннее 900 байт, завершаются ошибкой.

    • Если размер всех фиксированных ключевых столбцов плюс минимальный размер всех переменных столбцов, указанных в инструкции CREATE INDEX, превышает 900 байт, инструкция CREATE INDEX завершается ошибкой.

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

Минимальный размер столбца с переменной длиной + размер столбца с фиксированной длиной данных

Максимальный размер столбца с переменной длиной + размер столбца с фиксированной длиной данных

Максимальное значение (MAX) суммы (SUM) длин ключевых столбцов индекса для существующих строк*

Индекс создан

Тип сообщений

Ошибка выполнения инструкции INSERT или UPDATE, вызванная превышением размера значения ключа индекса

> 900 байт

Несущественно

Несущественно

Нет

Ошибка

Отсутствует индекс для формирования ошибки.

<= 900 байт

<= 900 байт

Несущественно

Да

Нет

Нет

<= 900 байт

> 900 байт

<= 900 байт

Да

Предупреждение

Только если сумма текущих длин всех столбцов индекса превышает 900 байт.

<= 900 байт

> 900 байт

> 900 байт

Нет

Ошибка

Отсутствует индекс для формирования ошибки.

* Ни в одной строке таблицы во время выполнения инструкции CREATE INDEX не должно быть значений ключа индекса, общая длина которых превышает 900 байт.

Использование включенных столбцов для обхода ограничений по размеру

Для обхода текущих ограничений на размер индекса — не более 16 ключевых столбцов и размер ключа индекса не более 900 байт — можно включать в некластеризованный индекс неключевые столбцы. В компоненте SQL Server Database Engine неключевые столбцы не учитываются при вычислении количества ключевых столбцов индекса или общего их размера. В некластеризованном индексе с включенными столбцами общий размер ключевых столбцов индекса ограничен 900 байтами. Общий размер всех неключевых столбцов ограничен только размером столбцов, указанных в предложении INCLUDE; например столбцы varchar(max) могут иметь размер до 2 ГБ. Столбцы в предложении INCLUDE могут принадлежать к любым типам данных, кроме text, ntext и image.

ПримечаниеПримечание

Если при секционировании таблиц ключевых столбцов секционирования нет в неуникальном кластеризованном индексе, то они добавляются в индекс с помощью компонента Database Engine. Совокупный размер индексируемых столбцов (без учета включенных столбцов) и всех добавленных столбцов секционирования не может превышать 1800 байт в неуникальном кластеризованном индексе.