Я знаю, что при использовании VARCHAR(MAX)/NVARCHAR(MAX)
столбцов данные сохраняются out of the row
- в строке данных будет указатель на другое место, где хранится «большое значение».
У меня есть следующие вопросы:
- Каждое поле хранится
out of the row
или толькоmax
те? - Если вы используете
clustered index
таблицу для чтения всей записи, считываются ли поля, хранящиеся вне строки, тоже?
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, могут быть перемещены вне строки.Сканирование кластерного индекса проходит только внутристрочные данные. Если для запроса требуются данные вне строки, они ищутся с помощью указателя в строке.
источник
Scanning the clustered index traverses only in-row data.
? Например, если вы хотите отобразитьNVARCHAR(MAX)
значения полей, как можно работать только сin-row-data
(если значения хранятся вне строки)? Или когда вы используете кластерный индекс (потому что нет покрывающего индекса), но вы не собираетесьwork
использоватьNVARCHAR(MAX)
поле, SQL Server достаточно умен, чтобы это увидеть и пропустить поискout-of-row
данных?int
иnvarchar(max)
вы выбираете толькоint
столбец, SQL-сервер не тратит ресурсыread
наout-of-row
данные, так как знает, что вы не собираетесь их использовать?sp_tableoption
вы можете убрать из таблицы все, что не часто используется, чтобы уменьшить размер строки, когда выполняется много поисков / сканирований кластерного индекса.text
,ntext
иimage
. Конечно, вы также можете хранить большие типы в отдельной таблице.Это поведение для хранения больших объектов может контролироваться настройкой таблицы:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
Ссылка в документации по SQL Server 2012 находится по адресу: http://msdn.microsoft.com/en-us/library/ms173530.aspx.
Таким образом, вы можете контролировать, где пространство используется, в строке или хранится вне строки.
источник