Nach dem Erstellen der tpch-Datenbank in meinem SQL Server habe ich die folgende Abfrage versucht:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
Das Tabellenzeilenelement hat einen nicht gruppierten Index für l_partkey. Ich habe die obigen Abfragen mehrmals ausgegeben und festgestellt, dass die logischen Lesevorgänge jedes Mal variieren:
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.
Aus dem Beitrag hier: Die Anzahl der logischen Lesevorgänge variiert . Ich weiß, dass dies durch das Vorleseverhalten verursacht werden kann.
ABER genau, warum Vorauslesen zu logischeren Lesevorgängen führen kann? Wie ändert sich das SQL Server-Verhalten? Wie SQL Server kann mehr Indexseite lesen, da es sowieso im Cache ist?
Wie auch immer, ich habe das Vorauslesen deaktiviert und die obige Abfrage erneut ausgegeben. Jetzt werden jedes Mal die gleichen logischen Lesevorgänge gemeldet. ABER die logischen Lesevorgänge sind viel kleiner !!
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.
Meine Frage ist also, warum die Vorauslesefunktion viel mehr und verschiedene logische Lesevorgänge verursachen kann.
Aus Neugier habe ich eine andere Abfrage ohne "order by" versucht:
select top 100 * from dbo.lineitem
Hier ist das Ergebnis ohne vorher zu lesen:
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.
Hier ist das Ergebnis mit Vorauslesen:
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.
Der mit Vorauslesen hat noch mehr logische Lesevorgänge. Warum also?