Каков общий предел символов для индекса в 900 байтов, который имеет SQL Server 2012. Я создал столбец с varchar(2000)
, но я думаю, что он превышает 900-байтный, что SQL Server ограничен? Каким будет max varchar(?)
для размещения внутри столбца индекса 900 байтов?
Ограничение размера байта 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/, где добавлен хэш-столбец таблица затем индексируется и используется в ваших запросах.