Depois de criar o banco de dados tpch no meu SQL Server, tentei a consulta abaixo:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
O item de linha da tabela possui um índice não agrupado em l_partkey. Emiti as consultas acima várias vezes e descobri que as leituras lógicas variam a cada vez:
Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1007, physical reads 4, read-ahead reads 1720, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1030, physical reads 4, read-ahead reads 1792, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Da postagem aqui: A contagem de leitura lógica varia , eu sei que isso pode ser causado pelo comportamento de leitura antecipada.
MAS exatamente por que ler com antecedência pode causar leituras mais lógicas? Como isso altera o comportamento do SQL Server? Como o SQL Server pode ler mais página de índice, pois está em cache, afinal?
De qualquer forma, desabilitei a leitura antecipada e emita a consulta acima novamente. Agora ele relata a mesma quantidade de leituras lógicas a cada vez. MAS as leituras lógicas são muito menores !!
Table 'lineitem'. Scan count 1, logical reads 404, physical reads 160, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Portanto, minha pergunta é: por que o recurso de leitura antecipada pode causar muito mais e várias leituras lógicas contam?
Por curiosidade, tentei outra consulta sem o "ordenar por":
select top 100 * from dbo.lineitem
Aqui está o resultado sem ler adiante:
Table 'lineitem'. Scan count 1, logical reads 5, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Aqui está o resultado com a leitura adiante:
Table 'lineitem'. Scan count 1, logical reads 15, physical reads 2, read-ahead reads 3416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Aquele com leitura à frente ainda tem leituras mais lógicas. Então por que?