Ein logischer Lesevorgang wird gezählt, wenn während der Abfrageausführung eine einzelne Seite aus dem Puffercache abgerufen wird. Dies wird unabhängig davon gezählt, ob zum Zwischenspeichern der Seite ein physischer oder ein Vorauslesen verwendet wurde oder ob die Seite bereits im Puffercache vorhanden war. Folglich ist das logische Lesen ein Maß dafür, wie oft Seiten während der Ausführung der Abfrage tatsächlich im Speicher berührt wurden.
Ein physischer Lesevorgang wird gezählt, wenn die Speicher-Engine eine oder mehrere Seiten aus dem Speicher liest, da sich die angeforderte Seite noch nicht im Cache befindet. Dies schließt physische E / A aus, die durch Vorauslesescans ausgeführt werden.
Ein Vorauslesen wird gezählt, wenn die Speicher-Engine während aufeinanderfolgender Scans einen oder mehrere vollständige Bereiche (jeder Bereich umfasst 8 zusammenhängende Seiten) aus dem Speicher liest. Beim Vorauslesen werden Daten aggressiv vorab in den Speicher abgerufen, sodass die Seiten wahrscheinlich bereits zwischengespeichert werden, wenn sie von der Abfrage benötigt werden. Die Anzahl der von Read-Ahead-Scans gelesenen Extents variiert je nach SQL Server-Version und -Version sowie nach Fragmentierung. Ich habe gesehen, dass Read-Ahead-Scans bei Scans in Enterprise Edition mit der neuesten SQL Server-Version bis zu 4 MB gleichzeitig mit einem einzigen Scatter-Gather-E / A lesen.
Beachten Sie, dass sich die SQL Server- Speicher-Engine bei einem kalten Cache anders verhält (z. B. nach einem Neustart oder DBCC DROPCLEANBUFFERS
). Wenn der Cache noch nicht aufgewärmt ist (Zielseiten des Puffermanagers wurden erfüllt), führt die Speicher-Engine vollständige 64-KB-Lesevorgänge anstelle einzelner 8-KB-Seitenlesevorgänge durch, um Seiten in den Cache einzulesen. Dies erwärmt den Cache viel schneller als sonst.
Ich konzentriere mich zum Zwecke der Abfrage- und Indexoptimierung lieber auf logische als auf physische Lesevorgänge, da dies ein besseres Maß für die von der Abfrage geleistete Arbeit ist. Es ist nur zufällig, ob Daten zwischengespeichert werden oder nicht. Das Testen mit einem kalten Cache ist meiner Meinung nach eher ein Maß für die Speicherleistung als für die Abfrageleistung und nicht repräsentativ für das, was unter einer Produktionsauslastung mit einem warmen Cache auftreten wird.