Après avoir créé la base de données tpch dans mon SQL Server, j'ai essayé la requête ci-dessous:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
La table lineitem a un index non clusterisé sur l_partkey. J'ai émis les requêtes ci-dessus plusieurs fois et j'ai découvert que les lectures logiques varient à chaque fois:
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 l'article ici: Le nombre de lectures logiques varie , je sais que cela pourrait être causé par un comportement de lecture anticipée.
MAIS exactement pourquoi la lecture anticipée pourrait provoquer des lectures plus logiques? Comment cela change-t-il le comportement de SQL Server? Comme SQL Server peut lire plus de page d'index car il est de toute façon en cache?
Quoi qu'il en soit, j'ai désactivé la lecture anticipée et émettez à nouveau la requête ci-dessus. Maintenant, il rapporte à chaque fois la même quantité de lectures logiques. MAIS les lectures logiques sont beaucoup plus petites !!
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.
Donc, ma question est la suivante: pourquoi la fonction de lecture anticipée peut-elle entraîner de nombreuses lectures logiques supplémentaires?
Par curiosité, j'ai essayé une autre requête sans la "commande par":
select top 100 * from dbo.lineitem
Voici le résultat sans lire à l'avance:
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.
Voici le résultat avec lecture anticipée:
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.
Celui avec lecture anticipée a toujours des lectures plus logiques. Alors pourquoi?