Eu sei que quando as VARCHAR(MAX)/NVARCHAR(MAX)
colunas são usadas, os dados são armazenados out of the row
- a linha de dados terá um ponteiro para outro local onde o 'valor grande' é armazenado.
Tenho as seguintes perguntas:
- Cada campo é armazenado
out of the row
ou apenas essesmax
? - Se você estiver usando o
clustered index
da tabela para ler o registro inteiro, os campos que são armazenados fora da linha também serão lidos?
VARCHAR (MAX) ou NVARCHAR (MAX) é considerado como um 'tipo de valor grande'. Tipos de valores grandes geralmente são armazenados 'fora da linha'. Isso significa que o ...
Respostas:
Na verdade, isso depende da configuração da
large value types out of row
opção, que pode ser definida usandosp_tableoption
. A partir da documentação :O padrão é que os
MAX
valores sejam armazenados em linha , até 8000 bytes, se eles se ajustarem. A menos que você tenha usadosp_tableoption
para alterar o padrão, seusMAX
dados provavelmente serão armazenados em linha.Dito isso, é uma prática ruim usar
MAX
tipos de dados para valores que nunca excederão 8000 bytes - use um tipo não MAX. Além de qualquer outra coisa, o desempenho costuma ser significativamente menor ao lidar comMAX
tipos, porque o SQL Server deve estar preparado para lidar com dados que podem ter até 2 GB de tamanho.Somente
MAX
os. Além disso, se umaMAX
coluna anteriormente na linha for movida para fora da linha, somente essa coluna nessa linha será afetada. É substituído na linha por um ponteiro para aLOB
estrutura fora da linha . Há também circunstâncias em que colunas não MAX podem ser movidas para fora da linha.A varredura do índice clusterizado percorre apenas dados em linha. Se forem necessários dados fora da linha para a consulta, eles serão procurados usando o ponteiro na linha.
fonte
Scanning the clustered index traverses only in-row data.
? Por exemplo, se você deseja exibir osNVARCHAR(MAX)
valores do campo, como é possível trabalhar apenas com oin-row-data
(se os valores estiverem armazenados fora da linha)? Ou quando você estiver usando o índice em cluster (porque não há índice de cobertura), mas não estiverwork
usando oNVARCHAR(MAX)
campo, o SQL Server é inteligente o suficiente para ver isso e ignorar a pesquisa deout-of-row
dados?int
envarchar(max)
você estiver selecionando apenas aint
coluna, o SQL-Server não desperdiçará recursos pararead
osout-of-row
dados, pois sabe que você não os usará?sp_tableoption
você, é possível colocar fora da tabela tudo o que geralmente não é usado para reduzir o tamanho da linha, quando muitas buscas / verificações de índice clusterizado são feitas.text
,ntext
eimage
. Você também pode armazenar os tipos grandes em uma tabela separada, é claro.Esse comportamento para armazenamento de objetos grandes pode ser controlado pela configuração da tabela:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
A referência na documentação do SQL Server 2012 está em: http://msdn.microsoft.com/en-us/library/ms173530.aspx
Portanto, você pode controlar onde o espaço é usado, em linha ou armazenado fora de linha.
fonte