2016-03-22 8 views
2

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.

Antwort

0

Für allgemeine Statistiken können Sie sich pg_stat_database.xact_rollback ansehen. Wenn Sie wissen wollen, welche Anweisungen zurückgerollt werden, ist das Einzige, was mir dabei in den Sinn kommt, dass C-Code nicht alle Anweisungen protokolliert und dann in den Protokollen nachschlägt.

Wenn Sie in den C-Code eintauchen (oder jemanden bezahlen wollen), denke ich nicht, dass es furchtbar schwierig wäre, Rollback-Unterstützung zu pg_stat_statements hinzuzufügen, und ich vermute, dass die Community das begrüßen würde.