Fragen zur Ausgabe von "Statistik IO"

7
  • Ist die Gesamtzahl der physischen Lesevorgänge, die eine Abfrage durchgeführt hat, = [physische Lesevorgänge] + [Vorauslesen]?
  • Warum haben wir manchmal [physische Lesevorgänge] = 0, während [Vorauslesen]> 0 ist? was bedeutet das?
  • Wie viele Seiten liest SQL Server in einem physischen Lesevorgang? ... wenn es eins zu eins ist, dann
  • Warum entspricht bei "select * from aTable" die Anzahl der [physischen Lesevorgänge] und / oder [Read-Ahead-Lesevorgänge] nicht der Anzahl der Seiten der Tabelle? obwohl der Cache vor dem Ausführen der Abfrage geleert wurde.
  • Warum ist [logische Lesevorgänge] manchmal größer als [physische Lesevorgänge] + [Vorauslesen] und sogar größer als die Gesamtzahl der Seiten der Tabelle?
Abutmah
quelle

Antworten:

7

Ist die Gesamtzahl der physischen Lesevorgänge, die eine Abfrage durchgeführt hat, = [physischer Lesevorgang] + [Vorauslesen]?

Nein, diese werden separat berechnet.

Physische Lesevorgänge: Die Anzahl der vom Datenträger ausgeführten Seiten wird in den ausführbaren Zustand versetzt und wartet, bis die E / A abgeschlossen ist.

Vorlesen lautet:

Das Datenbankmodul unterstützt einen Mechanismus zur Leistungsoptimierung, der als Vorauslesen bezeichnet wird. Read-Ahead antizipiert die Daten- und Indexseiten, die zur Erfüllung eines Abfrageausführungsplans erforderlich sind, und bringt die Seiten in den Puffercache, bevor sie tatsächlich von der Abfrage verwendet werden. Auf diese Weise können sich Berechnung und E / A überschneiden, wobei sowohl die CPU als auch die Festplatte voll ausgenutzt werden. Es gibt zwei Arten des Vorauslesens: eine für Datenseiten und eine für Indexseiten.

Warum haben wir manchmal [physische Lesevorgänge] = 0, während [Vorauslesen]> 0 ist? was bedeutet das?

Wie bereits erwähnt, read ahead pagessind nicht in enthalten physical read. Dies bedeutet, dass sich alle erforderlichen Seiten bereits im Cache befinden. Entweder waren die Seiten bereits vorhanden oder sie wurden durch einen Vorauslesemechanismus in den Cache gestellt.

Wie viele Seiten liest SQL Server in einem physischen Lesevorgang? ... wenn es eins zu eins ist, dann

Es ist nicht eins zu eins. Es wird variieren. Siehe Referenzabschnitt unten.

Warum entspricht bei "select * from aTable" die Anzahl der [physischen Lesevorgänge] und / oder [Read-Ahead-Lesevorgänge] nicht der Anzahl der Seiten der Tabelle? obwohl der Cache vor dem Ausführen der Abfrage geleert wurde.

Wie erläutert, kann ein physisches Lesen und Vorauslesen mehr als eine Seite gleichzeitig lesen.

Mit dem Vorauslesemechanismus kann das Datenbankmodul bis zu 64 zusammenhängende Seiten (512 KB) aus einer Datei lesen. Der Lesevorgang wird als einzelner Scatter-Gather-Lesevorgang für die entsprechende Anzahl von (wahrscheinlich nicht zusammenhängenden) Puffern im Puffercache ausgeführt. Wenn eine der Seiten im Bereich bereits im Puffercache vorhanden ist, wird die entsprechende Seite aus dem Lesevorgang verworfen, wenn der Lesevorgang abgeschlossen ist. Der Seitenbereich kann auch von beiden Enden "abgeschnitten" werden, wenn die entsprechenden Seiten bereits im Cache vorhanden sind.

warum manchmal [logische Lesevorgänge] größer ist als [physische Lesevorgänge] + [Vorauslesen]

Da sich Ihre Seiten bereits im Puffer befinden, bedeutet Lesen in diesem Fall logisches Lesen und Sie benötigen kein physisches Lesen + Lesen im Voraus (oder Sie benötigen weniger als).

und noch größer als die Gesamtzahl der Seiten der Tabelle?

Es ist möglich, dieselbe Seite mehr als einmal zu lesen, während Sie aus dem Cache lesen. Denken Sie an die Suchoperation für einen Index. Wenn Sie 10 Suchvorgänge ausführen müssen, führen Sie immer 10 logische Lesevorgänge auf der Stammseite und möglicherweise 10 logische Lesevorgänge auf jeder Zwischenebene durch.

Referenz:

SqlWorldWide
quelle
3
Ich möchte nur hinzufügen, dass SQL Server in SQL 2016 und höher Vorauslesungen von bis zu 4 MB durchführt. Ich habe dies mit einem XE-Trace von file_read_completed-Ereignissen gelernt.
Dan Guzman