Tag Archives: Indexes

SQL Server 2016: увеличен максимальный размер ключа в некластерном индексе

В SQL Server 2016 и в Azure SQL Database увеличен максимальный размер ключа в некластерном индексе с 900 до 1700 байт. Максимальный размер ключа для кластерного индекса по-прежнему остается 900 байт.

Ниже приведен пример, когда создается таблица со строковым полем фиксированной длины 1700 байт и индексом на этом поле.

if object_id('dbo.test_table', 'U') is not null
	drop table dbo.test_table;
go
 
create table dbo.test_table (
	c1 varchar(1700) not null
);
go
 
create index ix_test_c1 on dbo.test_table (c1)
go
 
insert into dbo.test_table values (replicate('A', 1700))
go

Скрипт успешно отрабатывает на SQL Server 2016. На ранних версиях SQL Server команда CREATE INDEX выдает предупреждение.

Warning! The maximum key length is 900 bytes. The index ‘ix_test_c1’ has maximum length of 1700 bytes. For some combination of large values, the insert/update operation will fail.

А при попытке вставить какие данные в таблицу – ошибку.

Msg 1946, Level 16, State 3, Line 13
Operation failed. The index entry of length 1700 bytes for the index ‘ix_test_c1’ exceeds the maximum length of 900 bytes.

При создании некластерных колоночных индексов вы можете указать столбцы, которые будут храниться в колоночном формате. Эти колонки не будут являться ключом индекса, и здесь нет жесткого ограничения на их размер.

Для некластерных индексов в in-memory таблицах ограничение на размер ключа составляет 2500 байт, для hash индексов ограничений нет.