Предупреждение о длине ключа кластерного индекса на 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>) Обертка вокруг выражения.

Другие вопросы по тегам