Después de crear la base de datos tpch en mi SQL Server, probé la siguiente consulta:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
El elemento de línea de tabla tiene un índice no agrupado en l_partkey. Emití las consultas anteriores varias veces y descubrí que las lecturas lógicas varían 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.
De la publicación aquí: el recuento de lectura lógica varía , sé que podría deberse a un comportamiento de lectura anticipada.
¿PERO exactamente por qué leer con anticipación podría causar más lecturas lógicas? ¿Cómo cambia el comportamiento del servidor SQL? Al igual que SQL Server, ¿puede leer más páginas de índice ya que de todos modos está en caché?
De todos modos, deshabilité la lectura anticipada y emití la consulta anterior nuevamente. Ahora informa la misma cantidad de lecturas lógicas cada vez. ¡PERO las lecturas lógicas son mucho más pequeñas!
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.
Entonces mi pregunta es, ¿por qué la función de lectura anticipada podría causar muchas más y varias lecturas lógicas cuentan?
Por curiosidad, probé otra consulta sin el "ordenar por":
select top 100 * from dbo.lineitem
Aquí está el resultado sin leer a continuación:
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.
Aquí está el resultado con lectura anticipada:
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.
El que tiene lectura anticipada aún tiene lecturas más lógicas. ¿Entonces por qué?