Предупреждение о длине ключа кластерного индекса на varchar(120)?
Итак, сегодня я занимался оптимизацией, создавая индексированные представления и т. Д., И я столкнулся с этим предупреждением.
Предупреждение! Максимальная длина ключа для кластеризованного индекса составляет 900 байтов. Индекс 'IX_...' имеет максимальную длину 8004 байта. Для некоторой комбинации больших значений операция вставки / обновления завершится неудачно.
Индекс
CREATE UNIQUE CLUSTERED INDEX IX_.. ON [aView] ([id], [type])
Вид
CREATE VIEW aView
WITH SCHEMABINDING
AS
SELECT Id, Replace(Replace([aField],'....',''),'....','') AS [Type], COUNT_BIG(*) AS DistinctTotal
FROM .....
INNER JOIN........
Идентификатор INT
Поле в физической таблице - это VARCHAR(120)
Таким образом, максимальная длина ключа для индекса будет 120+4 байта, не так ли?
Почему я вижу это предупреждение?
Это действительно?
1 ответ
Для вашей конкретной ситуации, анализ всех входов в ваш REPLACE
вызовы, мы можем видеть, что они могут только когда-либо оставить строку одинаковой длины или меньше.
Но в целомREPLACE
может в теории вернуть varchar(8000)
даже если один из его входов был только varchar(120)
, SQL Server не выполняет здесь сложный анализ - он видит replace
и предполагает тип возврата varchar(8000)
,
Поскольку мы знаем, что он никогда не будет превышать 120 символов после всех замен, добавьте явное CONVERT(varchar(120),<existing replaces>)
Обертка вокруг выражения.