Fortsetzung des Artikels "
Versuch, ein Analogon von ASH für PostgreSQL zu erstellen ".
Der Artikel wird anhand spezifischer Abfragen und Beispiele untersucht und angezeigt. Welche nützlichen Informationen können mithilfe des Verlaufs der Ansicht pg_locks abgerufen werden?
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
Pg_locks Übermittlungsverlauf
archive_lockingCREATE TABLE archive_locking ( timepoint timestamp without time zone , locktype text , relation oid , mode text , tid xid , vtid text , pid integer , blocking_pids integer[] , granted boolean , queryid bigint );
Tatsächlich ähnelt die Tabelle der hier ausführlicher beschriebenen Tabelle
archive_pg_stat_activity -
pg_stat_statements + pg_stat_activity + loq_query = pg_ash? und hier -
Ein Versuch, ein Analogon von ASH für PostgreSQL zu erstellen.Verwenden Sie die Funktion, um die
Abfrage-ID- Spalte zu füllen
update_history_locking_by_queryid Erläuterung: Der Wert der Spalte queryid wird in der Tabelle history_locking aktualisiert. Wenn Sie dann einen neuen Abschnitt für die Tabelle archive_locking erstellen, wird der Wert in historischen Werten gespeichert.
Impressum
Allgemeine Informationen zu den gesamten Prozessen.
WARTEN AUF SCHLÖSSER NACH LOCKTYPEN
Anfrage WITH t AS ( SELECT locktype , mode , count(*) as total FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND NOT granted GROUP BY locktype , mode ) SELECT locktype , mode , total * interval '1 second' as duration FROM t ORDER BY 3 DESC
Beispiel | WARTEN AUF SCHLÖSSER NACH LOCKTYPEN
+ -------------------- + ---------------------------- - + --------------------
| locktype | Modus | Dauer
+ -------------------- + ---------------------------- - + --------------------
| Transaktions-ID | Sharelock | 19:39:26
| Tupel | AccessExclusiveLock | 00:03:35
+ -------------------- + ---------------------------- - + --------------------
ENTNAHMEN VON SCHLÖSSERN NACH LOCKTYPEN
Anfrage WITH t AS ( SELECT locktype , mode , count(*) as total FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND granted GROUP BY locktype , mode ) SELECT locktype , mode , total * interval '1 second' as duration FROM t ORDER BY 3 DESC
Beispiel | ENTNAHMEN VON SCHLÖSSERN NACH LOCKTYPEN
+ -------------------- + ---------------------------- - + --------------------
| locktype | Modus | Dauer
+ -------------------- + ---------------------------- - + --------------------
| Beziehung | RowExclusiveLock | 51:11:10
| virtualxid | ExclusiveLock | 48:10:43
| Transaktions-ID | ExclusiveLock | 44:24:53
| Beziehung | AccessShareLock | 20:06:13
| Tupel | AccessExclusiveLock | 17:58:47
| Tupel | ExclusiveLock | 01:40:41
| Beziehung | ShareUpdateExclusiveLock | 00:26:41
| Objekt | RowExclusiveLock | 00:00:01
| Transaktions-ID | Sharelock | 00:00:01
| verlängern | ExclusiveLock | 00:00:01
+ -------------------- + ---------------------------- - + --------------------
Detaillierte Informationen zu bestimmten Abfragen von Abfrage-IDs
WARTEN AUF SCHLÖSSER NACH LOCKTYPEN NACH QUERYID
Anfrage WITH lt AS ( SELECT pid , locktype , mode , timepoint , queryid , blocking_pids , MIN ( timepoint ) OVER (PARTITION BY pid , locktype ,mode ) as started FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND NOT granted AND queryid IS NOT NULL GROUP BY pid , locktype , mode , timepoint , queryid , blocking_pids ) SELECT lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids , COUNT(*) * interval '1 second' as duration FROM lt GROUP BY lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids ORDER BY 4
Beispiel | WARTEN AUF SCHLÖSSER NACH LOCKTYPEN NACH QUERYID
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ - -
| pid | locktype | Modus | gestartet | queryid | blockierende_pids | Dauer
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ - -
| 11288 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 00:03:34
| 11626 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12380} | 00:00:29
| 11626 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {11092} | 00:03:25
| 11626 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12213} | 00:01:55
| 11626 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12751} | 00:00:01
| 11629 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 24.331935 | 389015618226997618 | {11092} | 00:03:22
| 11629 | Transaktions-ID | Sharelock | 2019-09-17 10: 00: 24.331935 | 389015618226997618 | {12007} | 00:00:01
| 12007 | Transaktions-ID | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11629} | 00:00:13
| 12007 | Transaktions-ID | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11092} | 00:01:10
| 12007 | Transaktions-ID | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11288} | 00:00:05
| 12213 | Transaktions-ID | Sharelock | 2019-09-17 10: 06: 07.328019 | 389015618226997618 | {12007} | 00:00:10
LOCKS NACH LOCKTYPEN NACH QUERYID NEHMEN
Anfrage WITH lt AS ( SELECT pid , locktype , mode , timepoint , queryid , blocking_pids , MIN ( timepoint ) OVER (PARTITION BY pid , locktype ,mode ) as started FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND granted AND queryid IS NOT NULL GROUP BY pid , locktype , mode , timepoint , queryid , blocking_pids ) SELECT lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids , COUNT(*) * interval '1 second' as duration FROM lt GROUP BY lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids ORDER BY 4
Beispiel | LOCKS NACH LOCKTYPEN NACH QUERYID NEHMEN
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ - -
| pid | locktype | Modus | gestartet | queryid | blockierende_pids | Dauer
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ - -
| 11288 | Beziehung | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 00:03:34
| 11092 | Transaktions-ID | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 00:03:34
| 11288 | Beziehung | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 00:00:10
| 11092 | Beziehung | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 00:03:34
| 11092 | virtualxid | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 00:03:34
| 11288 | virtualxid | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 00:03:34
| 11288 | Transaktions-ID | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 00:03:34
| 11288 | Tupel | AccessExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 00:03:34
Verwenden des Sperrverlaufs bei der Analyse von Leistungsvorfällen.- Eine Anforderung mit queryid = 389015618226997618, die von einem Prozess mit pid = 11288 ausgeführt wird, wird voraussichtlich 3 Minuten lang vom 17.09.2019 um 10:00:00 Uhr blockiert.
- Die Sperre wurde durch einen Prozess mit pid = 11092 gehalten
- Ein Prozess mit pid = 11092, der eine Abfrage mit queryid = 389015618226997618 ab dem 17.09.2019 um 10:00:00 Uhr ausführte, hielt die Sperre 3 Minuten lang.
Zusammenfassung
Nun hoffe ich, dass das Interessanteste und Nützlichste beginnt - das Sammeln von Statistiken und das Analysieren von Fällen zur Geschichte von Erwartungen und Sperren.
Ich möchte glauben, dass es sich in Zukunft als eine Art Notiz herausstellen wird (ähnlich wie beim Oracle Metalink).
Aus diesem Grund wird aus diesem Grund die verwendete Technik zur allgemeinen Einarbeitung so schnell wie möglich angezeigt.
In naher Zukunft werde ich versuchen, das Projekt auf Github zu bringen.