Eu tenho um aplicativo de consulta digitalizando uma tabela inteira com um campo de texto.
A consulta está fazendo isso muitas leituras:
Contagem de varredura 1, leituras lógicas 170586 , leituras físicas 3, leituras antecipadas 174716, leituras lógicas lob 7902578 , leituras físicas lob 8743, leituras antecipadas lob 0.
Plano de consulta com leituras lógicas de lob
Se eu remover o campo de texto da seleção, as leituras se tornarão o seguinte:
Contagem de varredura 1, leituras lógicas 170588 , leituras físicas 0, leituras antecipadas 0, leituras lógicas lob 0 , leituras físicas lob 0, leituras antecipadas lob 0.
Plano de consulta sem leituras lógicas de lob
A única coisa que eu não entendo é como o lob reads funciona:
se eu somar as leituras lógicas com leituras lógicas lob recebo um total de 8.073.164 leituras lógicas , que, se estiver correto, é cerca de 64 GB .
Mas todo o banco de dados tem apenas 7 GB!
Provavelmente estou perdendo algo sobre a adição de leituras lógicas e leituras lógicas de lob.
O que o número de leituras lógicas lob realmente representa?
Aqui está a minha teoria,
Estas são leituras lógicas, não leituras físicas. Imagine duas linhas, onde os dados LOB para essas linhas estão na mesma página (sim, as páginas podem ser compartilhadas entre linhas para dados LOB).
Talvez cada leitura leia apenas, digamos, 100 bytes. Cada leitura ainda é uma leitura lógica.
Além disso, você diz que esses são tipos de dados de texto, para os quais o padrão é não ter os dados LOB em linha. Se o tipo for varbinary(max), então o padrão é ter dados LOB em linha (desde que caibam na página). Isso pode fazer uma grande diferença, o que é melhor depende se você precisa frequentemente dos dados LOB ou não. Você pode reconfigurar isso (para ambos os tipos) usando sp_tableoption.
Acho que finalmente entendi agora.
SET STATISTICS IO ON
mostra 8.073.164 leituras lógicas de lob, que é exatamente o número total de registros * 2.Isso porque os dados LOB são armazenados em uma estrutura B-Tree como páginas normais! Assim, para cada linha, você executa 2 leituras lógicas adicionais: uma para a página raiz e outra para os próprios dados.
Isso é no meu caso específico, pois o maior texto dentro da tabela tem apenas 24 bytes.
Fonte