Должен ли я всегда использовать (n)varchar(max)
для текстовых столбцов?
Нет.
Для SQL Server max
типы данных следует указывать только тогда, когда альтернативы нет. Вместо этого следует выбрать правильный базовый тип ( varchar
или nvarchar
) и указать явную максимальную длину, соответствующую данным, которые будут сохранены.
Физическое хранилище идентично, независимо от того, указан столбец как varchar(n)
или varchar(max)
, так что это не проблема.
Причины, по которым нельзя выбирать (n)varchar(max)
везде, связаны с функциями, качеством плана и производительностью.
Исчерпывающий список, вероятно, не практичен, но, помимо прочего, max
столбцы:
особенности
- Требовать отдельное ограничение для обеспечения максимальной длины
- Не может быть ключом в индексе (поэтому также нет уникальных ограничений)
- Может предотвратить онлайн DDL (включая перестроение индекса и добавление нового ненулевого столбца)
- Как правило, не поддерживаются для более новых функций, например columnstore
- См. Документацию по продукту для более специфических функций и ограничений. Общая закономерность заключается в том, что существуют неудобные ограничения и ограничения в отношении
max
типов данных. Не все ограничения и побочные эффекты задокументированы.
Спектакль
- Требовать специальной обработки в исполнительном механизме, чтобы учесть потенциально очень большой размер. Как правило, это предполагает использование менее эффективного пути кода с интерфейсом потоковой передачи
- Может иметь аналогичные непредвиденные последствия для внешнего кода (и других компонентов SQL Server, таких как SSIS), который также должен быть подготовлен для обработки данных размером до 2 ГБ.
- Предполагается, что он имеет 4000 байтов в расчете на выделение памяти. Это может привести к чрезмерному резервированию памяти, что ограничивает параллелизм и вытесняет ценные индексы и страницы данных из кеш-памяти
- Отключить несколько важных оптимизаций производительности
- Может продлить продолжительность блокировки
- Может помешать оптимизатору выбрать (не динамический) план поиска
- Предотвращение вставки фильтров в сканирование и поиск в качестве остатка
- Может увеличить давление и конкуренцию в базе данных tempdb (зависит от версии), поскольку переменные и параметры также могут быть напечатаны так,
max
чтобы соответствовать определениям столбцов
Таким образом, существует так много тонких (и нежелательных) побочных эффектов ненужного использования max
спецификатора, что нет смысла делать это. Незначительное «удобство» использования одной декларации не является компенсацией.
Оцените каждый тип в контексте, используйте правильный базовый тип ( varchar
или nvarchar
) и разумную явную длину.
Дальнейшее чтение:
Пол Уайт говорит, что GoFundMonica
источник
varchar(not-max)
параметры, так что я как-то засунул рот себе в рот. Но да, SQL-инъекция будет применима здесь. Возможно, мне следует немного перефразировать этот ответ.