Ich habe eine Postgres 9.2-Datenbank, in der eine bestimmte Tabelle viele nicht entfernbare tote Zeilen enthält:
# SELECT * FROM public.pgstattuple('mytable');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
------------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
2850512896 | 283439 | 100900882 | 3.54 | 2537195 | 2666909495 | 93.56 | 50480156 | 1.77
(1 row)
Normales Staubsaugen zeigt auch viele nicht entfernbare tote Reihen:
# VACUUM VERBOSE mytable;
[...]
INFO: "mytable": found 0 removable, 2404332 nonremovable row versions in 309938 out of 316307 pages
DETAIL: 2298005 dead row versions cannot be removed yet.
There were 0 unused item pointers.
0 pages are entirely empty.
CPU 1.90s/2.05u sec elapsed 16.79 sec.
[...]
Die Tabelle enthält nur etwa 300.000 tatsächliche Datenzeilen, aber 2,3 Millionen tote Zeilen (und dies scheint bestimmte Abfragen sehr langsam zu machen).
Demnach SELECT * FROM pg_stat_activity where xact_start is not null and datname = 'mydb' order by xact_start;
gibt es keine alte Transaktion, die auf die Datenbank zugreift. Die ältesten Transaktionen sind einige Minuten alt und haben noch nichts auf dem Tisch geändert.
Ich habe auch überprüft select * from pg_prepared_xacts
(um nach vorbereiteten Transaktionen zu suchen) und select * from pg_stat_replication
(um nach ausstehenden Replikationen zu suchen), die beide leer sind.
In dieser Tabelle werden viele Einfügungen, Aktualisierungen und Löschungen durchgeführt, sodass ich verstehen kann, dass viele tote Zeilen erstellt werden. Aber warum werden sie nicht mit dem Befehl VACUUM entfernt?