Als kurze Ergänzung zum Artikel
Versuchen Sie, ein Analogon von ASH für PostgreSQL zu erstellen .
Herausforderung
Sie müssen den Ansichtsverlauf pg_stat_statemenets, pg_stat_activity verknüpfen. Mithilfe des Verlaufs der Ausführungspläne aus der Diensttabelle log_query erhalten Sie daher viele nützliche Informationen zur Lösung von Leistungsvorfällen und zur Optimierung von Abfragen.
Warnung
Aufgrund der Neuheit des Themas und des unvollständigen Testzeitraums kann der Artikel Fehler enthalten. Kritik und Kommentare werden nachdrücklich ermutigt und erwartet.
Daten eingeben
History_pg_stat_activity-Tabelle Tabelle Pg_stat_db_queries CREATE TABLE pg_stat_db_queries ( database_id integer , queryid bigint , query text , max_time double precision );(
Materialisierte Ansicht von mvw_pg_stat_queries CREATE MATERIALIZED VIEW public.mvw_pg_stat_queries AS SELECT t.queryid, t.max_time, t.query FROM public.dblink('LINK1'::text, 'SELECT queryid , max_time , query FROM pg_stat_statements WHERE dbid=(SELECT oid FROM pg_database WHERE datname=current_database() ) AND max_time >= 0 '::text) t(queryid bigint, max_time double precision, query text) WITH NO DATA;
Log_query-Tabelle CREATE TABLE log_query ( id integer , queryid bigint , query_md5hash text , database_id integer , timepoint timestamp without time zone , query text , explained_plan text[] , plan_md5hash text , explained_plan_wo_costs text[] , plan_hash_value text , ip text, port text , pid integer );
Allgemeiner Algorithmus
Aktualisieren Sie die Tabelle pg_stat_db_queries
Materialansicht aktualisieren mvw_pg_stat_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_queries_list( database_id int) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; BEGIN SELECT * INTO database_rec FROM endpoint e JOIN database d ON e.id = d.endpoint_id WHERE d.id = database_id ; IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_id; return TRUE ; END IF ; EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' port=5432 dbname='||database_rec.name|| ' user='||database_rec.s_name||' password='||database_rec.s_pass|| ' '')'; REFRESH MATERIALIZED VIEW mvw_pg_stat_queries ; PERFORM dblink_disconnect('LINK1'); RETURN result; END $$ LANGUAGE plpgsql;
Füllen Sie die Tabelle pg_stat_db_queries aus CREATE OR REPLACE FUNCTION refresh_pg_stat_db_queries( ) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; pg_stat_rec record ; BEGIN TRUNCATE pg_stat_db_queries; FOR database_rec IN SELECT * FROM database d LOOP IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_rec.id; CONTINUE ; END IF ; PERFORM refresh_pg_stat_queries_list( database_rec.id ) ; FOR pg_stat_rec IN SELECT * FROM mvw_pg_stat_queries LOOP INSERT INTO pg_stat_db_queries ( database_id , queryid , query , max_time ) VALUES ( database_rec.id , pg_stat_rec.queryid , pg_stat_rec.query , pg_stat_rec.max_time); END LOOP; END LOOP; RETURN TRUE; END $$ LANGUAGE plpgsql;
Infolgedessen enthält die Tabelle normalisierte Abfragetexte, queryid, die maximale Ausführungszeit der Abfrage zum aktuellen Zeitpunkt (zur Überwachung verwendet).
Füllen Sie log_query und erstellen Sie einen Verlauf der Ausführungspläne.
Der eigentliche Anforderungstext wird aus der Protokolldatei entnommen. Protokolldatei vom Zielhost zum Überwachungshost in Teilen, Bash-Skript, Cron. Aus Platzgründen und aufgrund der Trivialität der Aufgabe, einen Teil einer Textdatei von Host zu Host zu kopieren, wird das Skript nicht bereitgestellt.
Analysieren einer Protokolldatei und Extrahieren von Abfragetext Füllen der Log_query-Tabelle Infolgedessen enthält die Tabelle den tatsächlichen Anforderungstext, Ausführungspläne, den Hashwert des Ausführungsplans und den Hashwert des Anforderungstextes.
Geben Sie den Abfrage-ID-Wert in die Tabelle history_pg_stat_activity ein
update_history_pg_stat_activity_by_queryid.sql Infolgedessen enthält die Tabelle den Abfrage-ID-Wert, der dem Abfrage-ID-Wert der Abfrage entspricht.
Zusammenfassung
Durch Verknüpfen von pg_stat_activity, pg_stat_statements und log_query erhalten Sie viele nützliche Informationen zu der Anforderung, insbesondere:
- Geschichte der Umsetzungspläne.
- Verlauf der CPU-Zeitanforderung.
- Warteverlauf anfordern.
Daten und viele zusätzliche Berichte werden im nächsten Artikel beschrieben.
Entwicklung
Durch Verknüpfen der verfügbaren Informationen mit dem Verlauf der Ansicht pg_locks können Sie Informationen darüber abrufen, auf welche spezifischen Sperren die Anforderung gewartet hat und vor allem, welcher Prozess (Anforderung) diese Sperre gehalten hat.
Die Lösung für dieses Problem wird im nächsten Artikel beschrieben. Jetzt werden Tests und Verbesserungen durchgeführt.