Ограничение размера байта 900 байтов в длине символа

Каков общий предел символов для индекса в 900 байтов, который имеет SQL Server 2012. Я создал столбец с varchar(2000), но я думаю, что он превышает 900-байтный, что SQL Server ограничен? Каким будет max varchar(?) для размещения внутри столбца индекса 900 байтов?

Ответ 1

Размер хранилища для varchar - это фактическая длина введенных данных + 2 байта. Несмотря на то, что столбец имеет накладные расходы на 2 байта, вы можете присвоить значения 900 byte varchar в индексе.

На практике вы можете создать индекс в столбце размером более 900 байт, но у вас возникнет проблема, если вы действительно попытаетесь вставить что-то большее, чем 900 байт:

create table test (
    col varchar(1000)
);
create index test_index on test (col);
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail
-- Msg 1946, Level 16, State 3, Line 8
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes.

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

create table test (
      col varchar(1000)
    , otherCol bit -- This column will take a byte out of the index below, pun intended
);
create index test_index on test (col, otherCol);
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail

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

Ответ 2

В соответствующем примечании другой вариант, который вы можете попробовать, чтобы получить индекс в широком столбце, обозначен в http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server/, где добавлен хэш-столбец таблица затем индексируется и используется в ваших запросах.