Dopo aver creato il database tpch nel mio SQL Server, ho provato di seguito la query:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
La tabella lineitem ha un indice non cluster su l_partkey. Ho inviato le query precedenti per diverse volte e ho scoperto che le letture logiche variano ogni volta:
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.
Dal post qui: il conteggio logico delle letture varia , so che potrebbe essere causato dal comportamento di lettura anticipata.
MA esattamente perché leggere in anticipo potrebbe causare letture più logiche? Come cambia il comportamento di SQL Server? Come se SQL Server potesse leggere più pagine indice dal momento che è nella cache?
Ad ogni modo, ho disabilitato la lettura anticipata ed emettere nuovamente la query sopra. Ora riporta la stessa quantità di letture logiche ogni volta. MA le letture logiche sono molto più piccole !!
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.
Quindi la mia domanda è: perché la funzione di lettura anticipata potrebbe causare molte più e varie letture logiche contano?
Per curiosità, ho provato un'altra query senza "ordina per":
select top 100 * from dbo.lineitem
Ecco il risultato senza leggere in anticipo:
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.
Ecco il risultato con la lettura in anticipo:
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.
Quello con read ahead ha ancora letture più logiche. Allora perchè?