Mit erweiterten Abfragestatistiken können Sie Probleme mit der Abfrageleistung in Ihrer AlloyDB Omni-Datenbank erkennen, diagnostizieren und verhindern. Dabei werden Telemetriedaten der Datenbank erfasst, einschließlich normalisierter Abfragestatistiken, Warteereignisse, Client-IP-Adressen, Tags und Instanzlast. Verlaufsdaten werden 30 Tage lang aufbewahrt.
Mit erweiterten Query Insights können Sie folgende Aufgaben ausführen:
- Abfragen mit hoher Latenz und ressourcenintensive Abfragen identifizieren, indem Sie Ausführungszeit, E/A-Zeit, Wartezeit, Aktivität des gemeinsamen Zwischenspeichers und Zeilenanzahl analysieren.
- Engpässe beheben, indem Sie langsame Abfragen mit Warteereignissen und Warteereignisklassen korrelieren.
- Die Abfrageleistung bestimmten Anwendungskomponenten zuordnen, indem Sie Abfragen mit SQLCommenter Metadaten taggen.
- Aktive Abfragen und offene Transaktionen in Echtzeit überwachen und problematische Sitzungen beenden.
Hinweis
Prüfen Sie vor dem Aktivieren der erweiterten Query Insights, ob die folgenden Anforderungen erfüllt sind:
Sie verwenden eine eigenständige AlloyDB Omni-Instanz, die mit Linux-RPM-Paketen installiert wurde.
Sie haben
postgres-Superuserzugriff auf die Datenbankinstanz und Administratorzugriff, um den Datenbankdienst neu zu starten.Die Datenbank
alloydbadminist auf Ihrer Instanz vorhanden. AlloyDB Omni erstellt diese Datenbank standardmäßig bei der Initialisierung.
Erweiterte Abfragestatistiken aktivieren
So aktivieren Sie Query Insights:
Stellen Sie als
postgres-Superuser eine Verbindung zur Datenbankpostgresher:sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d postgresPrüfen Sie die geladenen Bibliotheken in
shared_preload_libraries, fügen Sie erweiterte Query Insights zur Vorabladeliste hinzu, aktivieren Sie die Erweiterung und beenden Siepsql:SHOW shared_preload_libraries; ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2'; ALTER SYSTEM SET google_insights_v2.enabled = on; \qErsetzen Sie
LIBRARY_1,LIBRARY_2und alle zusätzlichen vorhandenen Bibliotheken durch die Bibliotheksnamen, die vonSHOW shared_preload_librarieszurückgegeben werden. Setzen Sie jeden einzelnen Bibliothekseintrag in einfache Anführungszeichen, z. B.'g_stats','google_columnar_engine','google_insights_v2', und fügen Sie alle vorhandenen Bibliotheken ein, die von AlloyDB Omni benötigt werden, damit Sie sie nicht überschreiben.Starten Sie den AlloyDB Omni-Server neu, um die Vorabladeeinstellungen anzuwenden:
sudo systemctl restart alloydbomni18Stellen Sie als
postgres-Superuser eine Verbindung zur Datenbankalloydbadminher:sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d alloydbadminErstellen Sie die Erweiterung für erweiterte Query Insights in der Datenbank
alloydbadmin:CREATE EXTENSION IF NOT EXISTS google_insights_v2;Prüfen Sie, ob die Bibliothek geladen, die Erweiterung aktiviert und die Erweiterung
google_insights_v2inalloydbadmininstalliert ist:SHOW shared_preload_libraries; SHOW google_insights_v2.enabled; SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';Bestätigen Sie, dass
shared_preload_librariesdie Erweiterunggoogle_insights_v2enthält,google_insights_v2.enabledden Wertonzurückgibt und dasspg_extensioneine Zeile fürgoogle_insights_v2zurückgibt.
Dimensionen und Parameter für Funktionen
In AlloyDB Omni zeichnet Query Insights Datenbanktelemetriedaten in SQL-Tabellen, Ansichten und Funktionen in der Datenbank alloydbadmin für die folgenden Dimensionen und Funktionen auf:
- Abfragen: Verwenden Sie diese Dimension, um langsame oder ressourcenintensive SQL-Anweisungen zu identifizieren, wenn die Abfragelatenz zunimmt.
- Warteereignistypen: Verwenden Sie diese Dimension, um zu ermitteln, ob CPU, Festplatten-E/A oder Sperrkonflikte Engpässe bei der Arbeitslast verursachen.
- Warteereignisse: Verwenden Sie diese Dimension, um das spezifische PostgreSQL-Warteereignis zu identifizieren, z. B.
DataFileReadoderWALWrite, das die Abfrageausführung verzögert. - Datenbanken: Verwenden Sie diese Dimension, um den Ressourcenverbrauch zwischen logischen Datenbanken zu vergleichen und Datenbanken mit hoher Last auf freigegebenen Instanzen zu isolieren.
- Nutzer und Client-IP-Adressen: Verwenden Sie diese Dimension, um die Abfragelast bestimmten Datenbankrollen oder Client-IP-Adressen zuzuordnen und problematische Anwendungsclients zu identifizieren.
- Tags: Verwenden Sie diese Dimension, um die Datenbanklast mit bestimmten Anwendungsdiensten, Routen oder ORM-Aktionen zu korrelieren, die mit SQLCommenter getaggt sind.
- Aktive Abfragen: Verwenden Sie diese Dimension, um Leistungsspitzen, blockierte Transaktionen und lang andauernde Sitzungen in Echtzeit zu diagnostizieren.
Wenn Sie google_insights_v2.enabled auf on setzen, erfasst AlloyDB Omni automatisch Messwerte für Abfragen, Warteereignistypen, Warteereignisse, Datenbanken und Nutzer.
Wenn Sie einen google_insights_v2.*-Parameter zur Laufzeit aktualisieren möchten, ohne den Datenbankserver neu zu starten, führen Sie ALTER SYSTEM SET aus und laden Sie die Konfiguration neu:
ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();
Ersetzen Sie Folgendes:
PARAMETER_NAME: Der Name des zu konfigurierenden Parameters für erweiterte Query Insights, z. B.google_insights_v2.qi_track_active_queries,google_insights_v2.qi_track_tagodergoogle_insights_v2.qi_track_client_address.VALUE: Der neue Wert für den Parameter, z. B.on.
Beschreibungen der einzelnen Parameter, der entsprechenden Ansichten für die Beobachtbarkeit sowie der Messwerte und Spalten, die von jeder Ansicht zurückgegeben werden, finden Sie unter Referenz zu erweiterten Abfragestatistiken.
Zeitliche Detaillierungsgrade
Jede observability_service_*-Ansicht mit Verlaufsdaten ist mit drei zeitlichen Detaillierungsgraden verfügbar:
- Basisansichten (
*_view): 15-Sekunden-Intervalle. Verwenden Sie diese Ansichten, um aktuelle Spitzen oder Vorfälle in den letzten 1 bis 6 Stunden zu untersuchen. - Ansichten der groben Ebene 1 (
*_coarse_1_view): Aggregierte 5-Minuten-Intervalle für die 2.000 wichtigsten Abfragen. Verwenden Sie diese Ansichten, um Leistungstrends über 6 bis 24 Stunden zu analysieren. - Ansichten der groben Ebene 2 (
*_coarse_2_view): Aggregierte 30-Minuten-Intervalle für die 2.000 wichtigsten Abfragen. Verwenden Sie diese Ansichten, um Trends über mehrere Tage bis zum Aufbewahrungslimit von 30 Tagen zu analysieren.
In den Ansichten für die Beobachtbarkeit mit Verlaufsdaten werden alle Spalten für Ausführungs-, Warte- und E/A-Zeit in Mikrosekunden gespeichert, einschließlich total_execution_time, total_wait_time, total_read_time, total_write_time und time_spent.
Verlaufsdaten der Abfrageleistung abfragen
Stellen Sie eine Verbindung zur Datenbank alloydbadmin her, um Diagnoseabfragen für die Ansichten für die Beobachtbarkeit mit Verlaufsdaten auszuführen. Weitere Informationen finden Sie unter
AlloyDB Omni ausführen und eine Verbindung herstellen.
Die SQL-Anweisungen in diesem Abschnitt sind Beispielabfragen für häufige Szenarien zur Fehlerbehebung in den verschiedenen Dimensionen. Sie können diese Beispiele an Ihre Arbeitslast anpassen, z. B. den Zeitraum recorded_on ändern, nach bestimmten Datenbanken oder Rollen filtern oder *_coarse_1_view und *_coarse_2_view für Analysen über mehrere Tage abfragen.
Abfragen mit hoher Latenz identifizieren
Führen Sie die folgende Beispielabfrage für google_insights_v2.observability_service_query_view aus, um die 10 wichtigsten normalisierten Abfragen mit der höchsten Gesamtausführungszeit in der letzten Stunde zu finden:
SELECT
query_id,
database,
username,
left(query, 100) AS normalized_query,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
sum(total_rows) AS total_rows,
sum(total_shared_blocks_hit) AS shared_blocks_hit,
sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;
Warteereignisse nach Abfrage analysieren
Führen Sie die
folgende Beispielabfrage für
google_insights_v2.observability_service_wait_event_stats_by_query_view aus, um zu ermitteln, welche Warteereigniskategorien (wait_class) und detaillierten Warteereignisse
(wait_event) die meiste Wartezeit für eine bestimmte query_id verursachen:
SELECT
query_id,
database,
username,
wait_class,
wait_event,
sum(count) AS wait_occurrences,
sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;
Ersetzen Sie QUERY_ID durch den Wert query_id, der von observability_service_query_view zurückgegeben wird.
Datenbank-, Nutzer- und Client-IP-Last analysieren
Führen Sie die folgende Beispielabfrage für google_insights_v2.observability_service_db_load_conn_view aus, um die Gesamtausführungszeit, die Wartezeit und das Abfragevolumen für logische Datenbanken und Datenbankrollen in der letzten Stunde zu vergleichen:
SELECT
database,
username,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;
Wenn Sie google_insights_v2.qi_track_client_address aktivieren, können Sie mit der folgenden Beispielabfrage für google_insights_v2.observability_service_client_address_stats_by_query_view auch ermitteln, welche Client-IP-Adressen die meiste Abfragezeit verursachen:
SELECT
client_address,
username,
database,
query_id,
sum(count) AS total_executions,
sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;
Abfrageleistung nach Tags verfolgen
Wenn google_insights_v2.qi_track_tag auf on gesetzt ist und Ihre Abfragen
SQLCommenter Kommentare enthalten, führen Sie die
folgende Beispielabfrage aus, um die Ausführungszeit nach Metadaten für Anwendungstags zu aggregieren.
Verwenden Sie dazu google_insights_v2.observability_service_tag_view:
SELECT
application,
framework_name,
framework_controller,
framework_action,
framework_route,
database,
username,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
application,
framework_name,
framework_controller,
framework_action,
framework_route,
database,
username
ORDER BY total_execution_time_us DESC
LIMIT 10;
Aktive Abfragen überwachen
Wenn Sie google_insights_v2.qi_track_active_queries auf on setzen, können Sie
laufende Abfragen und offene Transaktionen in Echtzeit überwachen, indem Sie
google_insights_v2.stat_activity und google_insights_v2.stat_activity_v3 in
der Datenbank alloydbadmin abfragen.
In diesen Ansichten werden aktive Clientverbindungen, Sitzungs- und Transaktionsdauern sowie aktuelle Warteereignisse angezeigt. Hintergrundprozesse und alloydbadmin-Verbindungen werden dabei ausgeschlossen.
Aktive Sitzungen und Transaktionsdauern abfragen
Führen Sie die folgende Beispielabfrage in alloydbadmin aus, um zu ermitteln, welche Abfragen derzeit auf der Instanz ausgeführt werden und welche Transaktionen am längsten laufen:
SELECT
pid AS "Process ID",
left(normalized_query, 40) AS "Query",
state AS "Status",
round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
CASE
WHEN xact_start IS NOT NULL
THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
ELSE NULL
END AS "Transaction duration (secs)",
CASE
WHEN query_start IS NOT NULL
THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
ELSE NULL
END AS "Query duration (secs)",
COALESCE(wait_event_type, '') AS "Wait event type",
COALESCE(wait_event, '') AS "Wait event",
database AS "Database",
COALESCE(application_name, '') AS "Application name",
username AS "Username",
COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;
Lang andauernde Abfrage oder Transaktion beenden
Wenn Sie eine lang andauernde Abfrage oder blockierte Transaktion beenden möchten, die in google_insights_v2.stat_activity_v3 identifiziert wurde, übergeben Sie die Prozess-ID an pg_terminate_backend:
SELECT pg_terminate_backend(PROCESS_ID);
Ersetzen Sie PROCESS_ID durch den Wert Process ID (pid), der von google_insights_v2.stat_activity_v3 zurückgegeben wird.
Erweiterte Query Insights deaktivieren
Wenn Sie die Erfassung von Telemetriedaten beenden möchten, ohne Ihre AlloyDB Omni-Instanz neu zu starten, setzen Sie google_insights_v2.enabled auf off und laden Sie die Konfiguration neu:
ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();
Wenn Sie die Erweiterungsobjekte und gespeicherten Verlaufsdaten aus der Datenbank alloydbadmin entfernen möchten, stellen Sie eine Verbindung zu alloydbadmin her und löschen Sie die Erweiterung:
DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;