Получение предупреждающего сообщения при создании индекса в SQL Server - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица, которая содержит два столбца.Когда я пытался создать индекс для столбца NVARCHAR(2000), он показывает предупреждающее сообщение вроде:

Внимание!Максимальная длина ключа составляет 900 байт

Но для этой таблицы в SQL Server был создан индекс:

Create Table Test
(
     Id Int primary key,
     ProdName Nvarchar(2000)
)

Вставлено 1 миллион записей.

Created index ix_Test on Test(ProdName)

Будет ли SQL Server использовать этот индекс для столбца ProdName в условии where?Поскольку он создан с предупреждением.

Обычно оператор Like не использует индекс?

1 Ответ

0 голосов
/ 16 декабря 2018

При создании индекса SQL Server проверяет метаданные столбца.Максимальная длина индекса для SQL Server 2012 составляет 900 байт, а для SQL Server 2016 (1700 байт).

Для NVARCHAR(2000) максимальный размер в байтах равен 4000, и он превышает максимальный предел индекса.

Create Table Test(Id Int primary key,ProdName Nvarchar(2000));
INSERT INTO Test VALUES (1, REPLICATE('0123456789',45));
Create index ix_Test ON Test(ProdName);
INSERT INTO Test VALUES (2, REPLICATE('0123456789',46));
-- Operation failed. The index entry of length 920 bytes for the index    
--'ix_Test' exceeds the maximum length of 900 bytes.

db <> fiddle demo

Внимание!Максимальная длина ключа составляет 900 байт. Индекс 'ix_Test' имеет максимальную длину 4000 байт. Для некоторой комбинации больших значений операция вставки / обновления завершится неудачей.


Это означает, что внутри вашего столбца есть строковые значения, которые короче 450 символов (900 байт).

SELECT MAX(DATALENGTH(ProdName))
FROM Test;
-- should be lower than 900

Что касается второго вопроса, то будет использоваться индекс, пока условие SARGable :

SELECT *
FROM Test
WHERE ProductName = 'ABC' -- index usage;

SELECT *
FROM Test
WHERE ProductName = 'AB%'; -- index usage

SELECT *
FROM Test
WHERE ProductName LIKE '%B%'; -- no index seek, index/table scan instead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...