Verbesserung der Abfrageleistung für Aurora PostgreSQL mit Aurora-optimierten Lesevorgängen
Mit Aurora-optimierten Lesevorgängen können Sie eine schnellere Abfrageverarbeitung mit Aurora PostgreSQL erreichen. Eine Aurora-PostgreSQL-DB-Instance, die Aurora-optimierte Lesevorgänge verwendet, bietet eine bis zu achtmal verbesserte Abfragelatenz und bis zu 30 % Kosteneinsparungen für Anwendungen mit großen Datensätzen, die die Speicherkapazität einer DB-Instance überschreiten.
Themen
Übersicht über Aurora-optimierte Lesevorgänge in PostgreSQL
Aurora-optimierte Lesevorgänge sind standardmäßig verfügbar, wenn Sie einen DB-Cluster erstellen, der Graviton-basierte R6GD- und Intel-basierte R6ID-Instances mit NVMe-Speicher (Non-Volatile Memory Express) verwendet. Dies ist in den folgenden Versionen von PostgreSQL verfügbar:
-
16.1 und alle höheren Versionen
-
15.4 und höhere Versionen
-
14.9 und höhere Versionen
Aurora-optimierte Lesevorgänge unterstützen zwei Funktionen: mehrstufigen Cache und temporäre Objekte.
Mehrstufiger Cache mit optimierten Lesevorgängen – Mithilfe eines mehrstufigen Caches können Sie die Caching-Kapazität Ihrer DB-Instance um das bis zu Fünffache des Instance-Speichers erweitern. Dadurch wird der Cache automatisch so verwaltet, dass er die aktuellsten, transaktionskonsistenten Daten enthält. Dadurch entfällt für Anwendungen der Aufwand, die Datenaktualität externer, auf Ergebnismengen basierender Caching-Lösungen zu verwalten. Dies bietet eine bis zu achtmal bessere Latenz für Abfragen, bei denen zuvor Daten aus dem Aurora-Speicher abgerufen wurden.
In Aurora ist der Wert für shared_buffers in der Standard-Parametergruppe normalerweise auf etwa 75 % des verfügbaren Speichers festgelegt. Für die Instance-Typen r6gd und r6id reduziert Aurora den shared_buffers-Speicherplatz jedoch um 4,5 %, um die Metadaten für den Cache für optimierte Lesevorgänge zu hosten.
Temporäre Objekte mit optimierten Lesevorgängen – Mit temporären Objekten können Sie eine schnellere Abfrageverarbeitung erreichen, indem Sie die von PostgreSQL generierten temporären Dateien im lokalen NVMe-Speicher ablegen. Dadurch wird der Datenverkehr zu Elastic Block Storage (EBS) über das Netzwerk reduziert. Dies bietet eine bis zu zweimal bessere Latenz und einen besseren Durchsatz für erweiterte Abfragen, bei denen große Datenmengen sortiert, verbunden oder zusammengeführt werden, die nicht in die auf einer DB-Instance verfügbare Speicherkapazität passen.
In einem E/A-optimierten Aurora-Cluster verwenden optimierte Lesevorgänge sowohl Tiered Cache als auch temporäre Objekte auf NVMe-Speicher. Mit der für optimierte Lesevorgänge aktivierten mehrstufigen Cache-Funktion weist Aurora den doppelten Instance-Speicher für temporäre Objekte zu, etwa 10 % des Speichers für interne Operationen und den verbleibenden Speicher als mehrstufigen Cache. In einem Aurora-Standard-Cluster verwenden optimierte Lesevorgänge nur temporäre Objekte.
E/A-optimierte Aurora-Cluster ermöglichen es Ihnen, den zugewiesenen Speicherplatz für temporäre Objekte mit aktivierten optimierten Lesevorgängen mithilfe des dynamischen Parameters aurora_temp_space_size auf Instance-Ebene anzupassen. Diese Größenanpassungsfunktion ist in den folgenden PostgreSQL-Versionen verfügbar:
-
16.8 und alle höheren Versionen
-
15.12 und höhere 15-Versionen
-
14.17 und höhere 14-Versionen
Mit diesem Parameter können Sie die Kapazität von 2x bis 6x des Instance-Speichers skalieren, ohne dass die Datenbank-Engine neu gestartet werden muss. Wenn Sie den Speicherplatz für temporäre Objekte erweitern, wird die Änderung sofort wirksam, unabhängig von gleichzeitigen Workloads. Wenn Sie den Speicherplatz reduzieren, wird die Anpassung jedoch erst abgeschlossen, wenn in den temporären Objekten genügend ungenutzter Speicherplatz für die neue Größenanforderung vorhanden ist. Nachdem Sie die Größe temporärer Objekte mit aktivierten optimierten Lesevorgängen geändert haben, passt sich der mehrstufige Cache automatisch an, um den verfügbaren Speicherplatz zu nutzen.
| Engine | Cluster-Speicherkonfiguration | Temporäre Objekte mit optimierten Lesevorgängen | Optimierter mehrstufiger Cache mit optimierten Lesevorgängen | Unterstützte Versionen |
|---|---|---|---|---|
| Aurora PostgreSQL-Compatible Edition | Standard | Ja | Nein | Aurora-PostgreSQL-Version 16.1 und alle höheren Versionen, 15.4 und höher, Version 14.9 und höher |
| E/A-optimiert | Ja | Ja |
Anmerkung
Ein Wechsel zwischen E/A-optimierten Clustern und Standard-Clustern auf einer NVMe-basierten DB-Instance-Klasse führt zu einem sofortigen Neustart der Datenbank-Engine.
Verwenden Sie in Aurora PostgreSQL den temp_tablespaces-Parameter zur Konfiguration des Tabellenbereichs, in dem die temporären Objekte gespeichert werden.
Verwenden Sie den folgenden Befehl, um zu überprüfen, ob die temporären Objekte konfiguriert sind:
postgres=> show temp_tablespaces;temp_tablespaces --------------------- aurora_temp_tablespace (1 row)
Der aurora_temp_tablespace ist ein von Aurora konfigurierter Tabellenbereich, der auf den lokalen NVMe-Speicher verweist. Sie können diesen Parameter nicht ändern oder zum Amazon-EBS-Speicher zurückkehren.
Verwenden Sie den folgenden Befehl, um zu überprüfen, ob der Cache der optimierten Lesevorgänge aktiviert ist:
postgres=> show shared_preload_libraries;shared_preload_libraries -------------------------------------------------------- rdsutils,pg_stat_statements,aurora_optimized_reads_cache
Verwenden von Aurora-optimierten Lesevorgängen
Wenn Sie eine DB-Instance von Aurora PostgreSQL mit einer der NVMe-basierten DB-Instances bereitstellen, verwendet die DB-Instance automatisch Aurora-optimierte Lesevorgänge.
Führen Sie einen der folgenden Schritte aus, um Aurora-optimierte Lesevorgänge zu aktivieren:
-
Erstellen Sie einen Aurora-PostgreSQL-DB-Cluster mit einer der NVMe-basierten DB-Instance-Klassen. Weitere Informationen finden Sie unter Erstellen eines Amazon Aurora-DB Clusters.
-
Ändern Sie eine vorhandene Aurora-PostgreSQL-DB-Instance so, dass eine der NVMe-basierten DB-Instance-Klassen verwendet wird. Weitere Informationen finden Sie unter Ändern eines Amazon Aurora-DB-Clusters.
Aurora-optimierte Lesevorgänge sind in allen AWS-Regionen verfügbar, in denen eine oder mehrere der DB-Instance-Klassen mit lokalem NVMe-SSD-Speicher unterstützt werden. Weitere Informationen finden Sie unter DB-Instance-Klassen von Amazon Aurora.
Um zu einer Aurora-Instance ohne optimierte Lesevorgänge zurückzukehren, ändern Sie die DB-Instance-Klasse Ihrer Aurora-Instance in eine ähnliche Instance-Klasse ohne flüchtigen NVMe-Speicher für Ihre Datenbank-Workloads. Wenn die aktuelle DB-Instance-Klasse beispielsweise db.r6gd.4xlarge ist, wählen Sie db.r6g.4xlarge aus, um zurückzuwechseln. Weitere Informationen finden Sie unter Ändern einer Amazon-DB-Instance.
Anwendungsfälle für Aurora-optimierte Lesevorgänge
Optimierter mehrstufiger Cache mit optimierten Lesevorgängen
Im Folgenden sind einige Anwendungsfälle aufgeführt, für die optimierte Lesevorgänge mit gestuftem Cache von Vorteil sein können:
-
Internetanwendungen wie Zahlungsabwicklung, Rechnungsstellung und E-Commerce mit strengen Leistungs-SLAs.
-
Echtzeit-Dashboards für Berichte, die Hunderte von Punktabfragen zur Erfassung von Metriken und Daten ausführen.
-
Generative KI-Anwendungen mit der Erweiterung pgvector zur Suche nach exakten oder nächstgelegenen Nachbarn in Millionen von Vektoreinbettungen.
Temporäre Objekte mit optimierten Lesevorgängen
Im Folgenden sind einige Anwendungsfälle aufgeführt, für die optimierte Lesevorgänge von Vorteil sein können:
-
Analytische Abfragen mit Common Table Expressions (CTEs), abgeleiteten Tabellen und Gruppierungsoperationen.
-
Lesereplikate, die die nicht optimierten Abfragen für eine Anwendung verarbeiten.
-
Bedarfsgesteuerte oder dynamische Berichtsabfragen mit komplexen Operationen wie GROUP BY und ORDER BY, für die nicht immer die entsprechenden Indizes verwendet werden können.
-
CREATE INDEX- oderREINDEX-Operationen zum Sortieren -
Andere Workloads, die interne temporäre Tabellen verwenden.
Überwachen von DB-Instances, die Aurora-optimierte Lesevorgänge verwenden
Sie können Ihre Abfragen, die den mehrstufigen Cache mit optimierten Lesevorgängen zum Aktivieren von Lesevorgängen verwenden, wie im folgenden Beispiel dargestellt mit dem Befehl EXPLAIN überwachen:
Postgres=>EXPLAIN (ANALYZE, BUFFERS) SELECT c FROM sbtest15 WHERE id=100000000QUERY PLAN -------------------------------------------------------------------------------------- Index Scan using sbtest15_pkey on sbtest15 (cost=0.57..8.59 rows=1 width=121) (actual time=0.287..0.288 rows=1 loops=1) Index Cond: (id = 100000000) Buffers: shared hit=3 read=2 aurora_orcache_hit=2 I/O Timings: shared/local read=0.264 Planning: Buffers: shared hit=33 read=6 aurora_orcache_hit=6 I/O Timings: shared/local read=0.607 Planning Time: 0.929 ms Execution Time: 0.303 ms (9 rows) Time: 2.028 ms
Anmerkung
Die Felder aurora_orcache_hit und aurora_storage_read im Buffers-Abschnitt des Erklärungsplans werden nur angezeigt, wenn optimierte Lesevorgänge aktiviert und ihre Werte größer als Null sind. Das read-Feld ist die Summe der Felder aurora_orcache_hit und aurora_storage_read.
Sie können DB-Instances, die Aurora-optimierte Lesevorgänge verwenden, mit den folgenden CloudWatch-Metriken überwachen:
-
AuroraOptimizedReadsCacheHitRatio -
FreeEphemeralStorage -
ReadIOPSEphemeralStorage -
ReadLatencyEphemeralStorage -
ReadThroughputEphemeralStorage -
WriteIOPSEphemeralStorage -
WriteLatencyEphemeralStorage -
WriteThroughputEphemeralStorage
Diese Metriken liefern Daten über den verfügbaren Instance-Speicher, die IOPS und den Durchsatz. Weitere Informationen zu diesen Metriken finden Sie unter Metriken auf Instance-Ebene für Amazon Aurora.
Sie können die pg_proctab-Erweiterung auch zum Überwachen des NVMe-Speichers verwenden.
postgres=>select * from pg_diskusage();major | minor | devname | reads_completed | reads_merged | sectors_read | readtime | writes_completed | writes_merged | sectors_written | writetime | current_io | iotime | totaliotime ------+-------+---------------------+-----------------+--------------+--------------+----------+------------------+---------------+-----------------+-----------+------------+---------+------------- | | rdstemp | 23264 | 0 | 191450 | 11670 | 1750892 | 0 | 24540576 | 819350 | 0 | 3847580 | 831020 | | rdsephemeralstorage | 23271 | 0 | 193098 | 2620 | 114961 | 0 | 13845120 | 130770 | 0 | 215010 | 133410 (2 rows)
Bewährte Methoden für Aurora-optimierte Lesevorgänge
Nutzen Sie die folgenden bewährten Methoden für Aurora-optimierte Lesevorgänge:
-
Überwachen Sie den verfügbaren Speicherplatz im Instance-Speicher mit der CloudWatch-Metrik
FreeEphemeralStorage. Wenn der Instance-Speicher aufgrund des Workloads der DB-Instance sein Limit erreicht, stellen Sie die Gleichzeitigkeit und die Abfragen ein, die intensiven Gebrauch von temporären Objekten machen, oder ändern Sie die Instance so, dass sie eine größere DB-Instance-Klasse verwendet. -
Überwachen Sie die CloudWatch-Metrik auf die Cache-Trefferrate für optimierte Lesevorgänge. Operationen wie VACUUM ändern sehr schnell eine große Anzahl von Blöcken. Dies kann zu einem vorübergehenden Rückgang der Trefferrate führen. Die
pg_prewarm-Erweiterung kann verwendet werden, um Daten in den Puffer-Cache zu laden, so dass Aurora einige dieser Blöcke proaktiv in den Cache der optimierten Lesevorgänge schreiben kann. -
Sie können das Cluster-Cache-Management (CCM) aktivieren, um den Puffer-Cache und den mehrstufigen Cache auf einem Tier-0-Reader aufzuwärmen, der als Failover-Ziel verwendet wird. Wenn CCM aktiviert ist, wird der Puffer-Cache regelmäßig gescannt, um Seiten, die bereinigt werden können, in den mehrstufigen Cache zu schreiben. Weitere Informationen zu CCM finden Sie unter Schnelle Wiederherstellung nach Failover mit der Cluster-Cacheverwaltung für Aurora PostgreSQL.