Estou perguntando isso por curiosidade, sendo inspirado por essa pergunta .
Sabemos que VARCHAR(MAX)
valores maiores que 8000 bytes não são armazenados em linhas, mas em páginas LOB separadas. A recuperação subsequente de uma linha com esse valor requer duas ou mais operações lógicas de E/S (essencialmente, uma a mais do que seria teoricamente necessária).
Podemos adicionar uma VARCHAR(MAX)
coluna, como INCLUDE
d, a um índice único, conforme demonstrado na pergunta vinculada. Se essa coluna tiver valores que excedam 8.000 bytes de comprimento, esses valores ainda serão armazenados "inline" nas páginas de folha de índice ou também serão movidos para páginas LOB?
Valores que excedem 8000 bytes não podem ser armazenados "inline". Eles são armazenados em páginas LOB. Você pode ver isso com sys.dm_db_index_physical_stats . Comece com uma tabela simples:
Agora insira algumas linhas com valores que levam 8000 bytes para a
VARCHAR(MAX)
coluna e confira o DMF:Não há páginas LOB no índice:
Mas se eu adicionar linhas com valores que levam 8001 bytes:
Agora eu tenho 1 página LOB no índice para cada linha que acabei de inserir:
Você também pode ver isso com
SET STATISTICS IO ON;
e a consulta correta. Considere a seguinte consulta que analisa apenas linhas com 8.000 bytes:Resultados ao executar:
Se eu consultar as linhas com 8001 bytes:
Agora eu vejo lob lê: