Подтвердить что ты не робот

Производительность SQL: есть ли какая-либо производительность, использующая NVarchar (MAX) вместо NVarChar (200)

Мне интересно, есть ли недостаток в определении столбца типа nvarchar (max) вместо того, чтобы дать ему (меньший) максимальный размер.

Я где-то читал, что если значение столбца имеет более 4 Кбайт, остальные данные будут добавлены в область "переполнения", что нормально.

Я создаю таблицу, где большую часть времени текст будет иметь несколько строк, но мне было интересно, есть ли преимущество в настройке нижнего предела, а затем добавление проверки, чтобы избежать нарушения этого предела.

Есть ли какое-либо ограничение на создание индексов с столбцом nvarchar (max) или все, что платит за добавление ограничения на ограничение размера?

Спасибо!

4b9b3361

Ответ 1

Строго говоря, типы MAX всегда будут немного медленнее, чем типы без MAX, см. Сравнение производительности varchar (max) vs varchar ( N). Но эта разница никогда не видна на практике, где она просто становится шумом в общей производительности, обусловленной IO.

Ваша главная проблема не должна заключаться в выполнении MAX или non-MAX. Вы должны быть обеспокоены вопросом, возможно, что в этом столбце будет храниться более 8000 байтов? Если ответ "да", даже если это очень маловероятное "да", тогда ответ очевиден: используйте тип MAX, боль, чтобы преобразовать этот столбец позже в тип MAX, не стоит незначительного преимущества в производительности типов без MAX.

Другие проблемы (возможность индексирования этого столбца, недоступность индексированных операций ONLINE для таблиц с столбцами MAX) уже были решены ответом Дениса.

Кстати, информация о столбцах более 4 КБ, имеющих оставшиеся данные в области переполнения, неверна. Правильная информация находится в Table and Index Organization:

Блок распределения ROW_OVERFLOW_DATA

Для каждого раздела, используемого таблицей (таблица с кучей или кластеризация), индекс или индексированный вид, есть один ROW_OVERFLOW_DATA. Эта единица выделения содержит нуль (0) страниц до строки данных с переменной (varchar, nvarchar, varbinary или sql_variant) в Единица выделения IN_ROW_DATA превышает ограничение размера строки в 8 КБ. Когда размер ограничение достигнуто, SQL Server перемещает столбец с наибольшим ширину от этой строки до страницы в ROW_OVERFLOW_DATA. 24-байтовый указатель на данные вне строки сохраняется на исходной странице.

Итак, это не столбцы более 4 КБ, это строки, которые не помещаются в свободное пространство на странице, и не являются "остальными", это весь столбец.

Ответ 2

индекс не может быть создан в столбце более 900 байт. Столбцы из типов данных большого объекта (LOB) ntext, text, varchar(max), nvarchar (max), varbinary (max), xml или изображение не могут быть указаны в качестве ключевых столбцов для индекса

вы можете использовать included columns

Разрешены все типы данных, кроме текста, текста и изображения. Индекс должен быть создан или перестроен в автономном режиме (ONLINE = OFF), если любой из указанных неключевых столбцов являются типами varchar (max), nvarchar (max) или varbinary (max).

Ответ 3

Выбор nvarchar (max) также может повлиять на оптимизацию плана выполнения, который автоматически настраивается движком сервера sql.