Eu sei que quando as VARCHAR(MAX)/NVARCHAR(MAX)
colunas são usadas, os dados são armazenados fora da linha ...
Na verdade, isso depende da configuração da large value types out of row
opção, que pode ser definida usando sp_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 usado sp_tableoption
para alterar o padrão, seus MAX
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 com MAX
tipos, porque o SQL Server deve estar preparado para lidar com dados que podem ter até 2 GB de tamanho.
Cada campo é armazenado fora da linha ou apenas no máximo?
Somente MAX
os. Além disso, se uma MAX
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 a LOB
estrutura fora da linha . Há também circunstâncias em que colunas não MAX podem ser movidas para fora da linha.
Se você estiver usando o índice clusterizado da tabela para ler o registro inteiro, os campos armazenados fora da linha também serão lidos?
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.