Index-Prefetch – Übersicht

AlloyDB for PostgreSQL verwendet Index-Prefetch, um Abfragen zu beschleunigen, die einen Bereich von Zeilen über einen B-Baum-Index lesen. Der Index-Prefetch ist standardmäßig auf AlloyDB- und AlloyDB Omni-Instanzen aktiviert, auf denen PostgreSQL 17 und höher ausgeführt wird. Sie müssen keine Flags festlegen, keine Indexe neu erstellen und keine Änderungen an Ihrer Anwendung oder Ihren SQL-Abfragen vornehmen, um davon zu profitieren.

Funktionsweise des Index-Prefetching

Wenn eine Abfrage einen Wertebereich über einen Index scannt, z. B. ein BETWEEN-Prädikat oder eine ORDER BY ... LIMIT-Klausel für eine indexierte Spalte, werden beim Scan Indexseiten und die Tabellenseiten gelesen, auf die die Indexeinträge verweisen. Diese Tabellenseiten sind oft über den Speicher verteilt. In Standard-PostgreSQL werden diese Seiten nacheinander gelesen. Wenn die Seiten also nicht bereits im Arbeitsspeicher vorhanden sind, wartet die Abfrage die meiste Zeit auf Speicher-E/A.

Beim Index-Prefetching prüft AlloyDB den Index und die Tabelle vor dem laufenden Scan und liest die Seiten, die der Scan benötigt, parallel. AlloyDB stellt die vorabgerufenen Seiten im lokalen SSD-Cache der Instanz bereit. Wenn der Scan eine Seite anfordert, wird die Seite aus dem schnellen lokalen Speicher statt aus dem Remotespeicher bereitgestellt. Vorabgerufene Seiten werden außerhalb der gemeinsam genutzten PostgreSQL-Zwischenspeicher bereitgestellt. Daher wird der Zwischenspeicher, der anderen Sitzungen zur Verfügung steht, durch das Prefetching nicht reduziert.

Der Index-Prefetch umfasst die folgenden Sicherheitsmaßnahmen, damit Abfragen, die nicht davon profitieren, nicht zusätzlich belastet werden:

  • Das Prefetching wird an der Grenze einer LIMIT-Klausel beendet. Der Scan liest also keine Seiten, die über die von der Abfrage zurückgegebenen Zeilen hinausgehen.
  • Bei reinen Indexscans für abdeckende Indexe ruft AlloyDB nur Indexseiten vorab ab und liest keine Tabellenseiten.
  • Abfragen, die eine einzelne Zeile zurückgeben, z. B. Primärschlüsselsuchen, lösen kein Prefetching aus.

Vorteile für Arbeitslasten

Der Index-Prefetch ist am hilfreichsten, wenn Ihr Arbeitssatz größer als der Arbeitsspeicher der Instanz ist und Ihre Abfragen viele Zeilen über einen B-Baum-Index lesen. Hier einige Beispiele für Abfragen, die davon profitieren:

  • Bereichsabfragen für indexierte Zeitstempel-, Datums- oder numerische Spalten, z. B. Berichte über ein Zeitfenster.
  • Abfragen, die viele Zeilen für einen Schlüssel zurückgeben, z. B. den Bestellverlauf für einen Kunden.
  • Joins, bei denen die innere Seite ein Indexscan ist, der viele Zeilen zurückgibt.
  • Analytische Abfragen, die große Bereiche aus zeilenorientierten Tabellen lesen.

Abfragen, deren Daten sich bereits in gemeinsamen Zwischenspeichern befinden, und Suchvorgänge in einzelnen Zeilen werden mit oder ohne Prefetching gleich ausgeführt.

Prefetching in Ausführungsplänen

Wenn Sie die Auswirkungen des Index-Prefetchings auf eine Abfrage sehen möchten, führen Sie die Abfrage mit EXPLAIN (ANALYZE, BUFFERS) aus. Seiten, die durch Prefetching in den lokalen SSD-Cache geladen werden, werden als ultra fast cache hit-Anzahl auf den Indexscan-Knoten des Plans angezeigt. Weitere Informationen zum Lesen dieser Zähler finden Sie unter Ausführungspläne abrufen und analysieren.

Nächste Schritte