Ограничение размера NVARCHAR в SQLServer?

Мне было интересно, каковы будут последствия установки полей NVARCHAR в MAX вместо определенного размера в SQL Server 2008 и ограничение ввода из логики приложения. Кроме того, будут ли они плохой проектной практикой?

Ответ 1

NVARCHAR (MAX) намного лучше работает с меньшими данными, чем старый тип данных NTEXT, однако NVARCHAR (n) всегда будет более эффективным в некоторых областях.

Как правило, использование типа данных, который лучше всего представляет данные, которые вы храните, почти всегда является наилучшей практикой.

Ответ 2

Есть много последствий для производительности. В частности, в скалярном UDF, заполняющем полный набор символов, я заметил огромные различия в производительности, когда результат был объявлен как VARCHAR (MAX), хотя входы не превышали > 40 символов. Переход на VARCHAR (50) сделал ОГРОМНОЕ улучшение.

Ответ 3

Вы не должны устанавливать все свои поля в NVARCHAR (MAX), если знаете, что они никогда не будут содержать больше конечного числа символов из-за того, как SQL хранит данные такого типа - данные, достаточно малые, чтобы поместиться на странице сохраняться на странице, но когда он становится слишком большим, он будет перемещен со страницы и будет храниться отдельно.

Кроме того, вы уверены, что вам нужен NVARCHAR, поскольку он хранит данные Unicode, которые занимают в два раза больше пространства стандартного VARCHAR? Если вы знаете, вы будете использовать стандартные символы, вместо этого используйте VARCHAR.

Slo, подумайте об использовании вашего приложения. Если у вас есть поле адреса, которое не имеет теоретического ограничения на его размер, как бы вы напечатали его на конверте? Вы говорите, что вы будете внедрять логику в приложение переднего конца, но почему все еще позволяют базы данных иметь слишком большие данные? И что произойдет, если данные попадут в базу данных, которая нарушает логику в вашем интерфейсе?

Ответ 4

Просто чтобы дополнить все остальные ответы: будьте осторожны с сценариями, в которых данные могут поступать из других источников, например, как пример - текстовые файлы, импортированные извне ваших приложений; это может обойти любую логику приложения, если вы не дублируете ее в процедурах импорта...

Ответ 5

Основной недостаток заключается в том, что NVARCHAR(MAX) нельзя индексировать с помощью простых индексов.

Кроме того, есть некоторые проблемы с переменными типа NVARCHAR(MAX) и с производительностью функций, анализирующих эти переменные.

Если вы хотите хранить и извлекать данные как есть, а не анализировать их на стороне SQL Server, тогда NVARCHAR(MAX) отлично.

Ответ 6

При расчете предела имеет побочный эффект некоторой проверки на максимальной длине