Ich untersuche häufig ausgeführte Abfragen in einer Postgres-Datenbank, um die Verwendung von XID zu reduzieren. Ich kann eine Liste der ausgeführten Abfragen und der Anzahl der Anrufe unter Verwendung von pg_stat_statements
abrufen, schließt jedoch keine Abfragen ein, die aus Gründen wie einer eindeutigen Integritätsverletzung fehlgeschlagen sind. Gibt es eine Möglichkeit, diese fehlgeschlagenen Abfragen aufzuzeichnen und zu zählen?Messen Sie die XID-Verwendung bei fehlgeschlagenen Abfragen in PostgreSQL
Beispiel:
test_xid=# \d test
Table "public.test"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
test_xid=# truncate test;
TRUNCATE TABLE
test_xid=# select pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------
(1 row)
test_xid=# select txid_current();
txid_current
--------------
224547
(1 row)
test_xid=# insert into test(id) values (1);
INSERT 0 1
test_xid=# insert into test(id) values (1);
ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (id)=(1) already exists.
test_xid=# insert into test(id) values (1);
ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (id)=(1) already exists.
test_xid=# insert into test(id) values (1);
ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (id)=(1) already exists.
test_xid=# select txid_current();
txid_current
--------------
224552
(1 row)
test_xid=# select query, calls from pg_stat_statements;
query | calls
------------------------------------+-------
insert into test(id) values (?); | 1
select pg_stat_statements_reset(); | 1
select txid_current(); | 2
(3 rows)
test_xid=# select pg_stat_statements_reset();
pg_stat_statements_reset
--------------------------
(1 row)
test_xid=# insert into test(id) values (1);
ERROR: duplicate key value violates unique constraint "test_pkey"
DETAIL: Key (id)=(1) already exists.
test_xid=# select query, calls from pg_stat_statements;
query | calls
------------------------------------+-------
select pg_stat_statements_reset(); | 1
(1 row)
Da die INSERT-Abfrage erscheint nicht in pg_stat_statments
gesehen werden kann, wenn es immer gescheitert, und wenn die Abfrage bereits von einer erfolgreichen Ausführung ist, wird der Anruf Zählung nicht erhöht werden eine nachfolgende fehlgeschlagene Abfrage, obwohl die fehlgeschlagene Abfrage die aktuelle XID erhöht.