Sé que cuando VARCHAR(MAX)/NVARCHAR(MAX)
se usan columnas, los datos se almacenan out of the row
: la fila de datos tendrá un puntero a otra ubicación donde se almacena el 'valor grande'.
Tengo las siguientes preguntas:
- ¿Se almacena cada campo
out of the row
o solomax
los? - Si está utilizando el
clustered index
de la tabla para leer el registro completo, ¿también se leen los campos almacenados fuera de la fila?
VARCHAR (MAX) o NVARCHAR (MAX) se considera como un "tipo de gran valor". Los tipos de valores grandes generalmente se almacenan 'fuera de fila'. Significa que el ...
Respuestas:
En realidad, eso depende de la configuración de la
large value types out of row
opción, que se puede configurar usandosp_tableoption
. De la documentación :El valor predeterminado es que los
MAX
valores se almacenen en fila , hasta 8000 bytes, si encajan. A menos que haya utilizadosp_tableoption
para cambiar el valor predeterminado, susMAX
datos probablemente se almacenarán en fila.Dicho esto, es una mala práctica usar
MAX
tipos de datos para valores que nunca excederán los 8000 bytes; en su lugar, use un tipo que no sea MAX. Además de cualquier otra cosa, el rendimiento a menudo es significativamente peor cuando se trata deMAX
tipos, porque SQL Server debe estar preparado para hacer frente a datos que pueden tener un tamaño de hasta 2 GB.Solo los
MAX
unos. Además, si unaMAX
columna de la fila anterior se mueve fuera de la fila, solo esa columna de esa fila se ve afectada. Se reemplaza en fila por un puntero a laLOB
estructura fuera de fila . También hay circunstancias en las que las columnas que no son MAX pueden moverse fuera de la fila.El escaneo del índice agrupado solo atraviesa datos en fila. Si se necesitan datos fuera de la fila para la consulta, se busca utilizando el puntero en fila.
fuente
Scanning the clustered index traverses only in-row data.
? Por ejemplo, si desea mostrar losNVARCHAR(MAX)
valores de campo, ¿cómo es posible trabajar solo conin-row-data
(si los valores se almacenan fuera de la fila)? ¿O cuando está utilizando el índice agrupado (porque no hay un índice de cobertura) pero no vawork
con elNVARCHAR(MAX)
campo, el SQL Server es lo suficientemente inteligente como para ver eso y omitir la búsqueda deout-of-row
datos?int
ynvarchar(max)
está seleccionando solo laint
columna, el servidor SQL no desperdicia recursos enread
losout-of-row
datos, ya que sabe que no los va a usar.sp_tableoption
puede eliminar de la tabla todo lo que no se usa con frecuencia para reducir el tamaño de la fila, cuando se realizan muchas búsquedas / escaneos de índices agrupados.text
,ntext
yimage
. También puede almacenar los tipos grandes en una tabla separada, por supuesto.Este comportamiento para el almacenamiento de objetos grandes se puede controlar mediante la configuración de la tabla:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
La referencia en la documentación de SQL Server 2012 está en: http://msdn.microsoft.com/en-us/library/ms173530.aspx
Por lo tanto, puede controlar dónde se utiliza el espacio, en fila o almacenado fuera de fila.
fuente