Я знаю, что при использовании VARCHAR(MAX)/NVARCHAR(MAX)
столбцов данные хранятся вне строки ...
На самом деле, это зависит от настройки large value types out of row
опции, которую можно установить с помощью sp_tableoption
. Из документации :
По умолчанию для MAX
значений , которые будут храниться в построчно , до 8000 байт, если они подходят. Если вы не использовали sp_tableoption
для изменения значения по умолчанию, ваши MAX
данные, скорее всего, будут храниться в строке.
Тем не менее, не рекомендуется использовать MAX
типы данных для значений, которые никогда не будут превышать 8000 байт - вместо этого используйте тип не-MAX. Помимо всего прочего, производительность при работе с MAX
типами часто значительно ниже , поскольку SQL Server должен быть готов справляться с данными, размер которых может достигать 2 ГБ.
Каждое поле хранится вне строки или только максимальные?
Только MAX
те. Кроме того, если ранее MAX
столбец строки был перемещен вне строки, затрагивается только этот столбец в этой строке. В строке он заменяется указателем на структуру вне строки LOB
. Существуют также обстоятельства, когда столбцы, отличные от MAX, могут быть перемещены вне строки.
Если вы используете кластерный индекс таблицы для чтения всей записи, считываются ли поля, хранящиеся вне строки, тоже?
Сканирование кластерного индекса проходит только внутристрочные данные. Если для запроса требуются данные вне строки, они ищутся с помощью указателя в строке.