web-dev-qa-db-fra.com

La table occupée ne devient pas d'aspirateur

Nous utilisons Postgres 9.2 sur Windows pour stocker des éliminations à basse fréquence Data: Nous insérons environ 2000 lignes par seconde chaque seconde 24 heures sur 24, 7 jours sur 7 sans temps d'arrêt. Il y a un DELETE qui fonctionne sur la table toutes les 10 minutes environ de maintenir la longueur de la table à un nombre fixe de jours. Cela finit par être un 900 millions de rows assez stable. (Pour les personnes intéressées, SELECT, INSERT, DELETE sont tous performants).

En tant que tel, DELETE, tandis que la suppression des lignes ne libère pas l'espace disque. Pour cela, nous avons besoin de VACUUM à courir.

J'ai interrogé le pg_stat_user_tables et VACUUM semble ne pas avoir jamais exécuté.

Ce que je comprends de divers documents ( http://www.postgresql.org/docs/9.2/static/troutine-vacuuming.html ):

  • nous semblons avoir l'aspirateur automatique et il s'agit d'autres tables.
  • l'aspirateur automatique ne fonctionne pas FULL et ne doit pas nécessiter une serrure exclusive sur la table.

Quelqu'un a-t-il des idées pourquoi l'aspirateur automatique ne fonctionne pas? Est-ce purement parce que la table est continuellement occupée?

Et il vaut la peine de courir VACUUM après chaque DELETE Dans ce cas (qui fonctionne toutes les 10 minutes)?

Éditer:

Requête en utilisant le SQL à partir du SO Link ci-dessous:

-[ RECORD 2 ]---+---------------------------
schemaname      | stats
relname         | statistic_values_by_sec
last_vacuum     |
last_autovacuum |
n_tup           |    932,315,264
dead_tup        |    940,727,818
av_threshold    |    186,463,103
expect_av       | *

et sortie brute:

-[ RECORD 3 ]-----+---------------------------
relid             | 501908
schemaname        | stats
relname           | statistic_values_by_sec
seq_scan          | 12
seq_tup_read      | 4526762064
idx_scan          | 29643
idx_tup_fetch     | 2544206912
n_tup_ins         | 1573896877
n_tup_upd         | 0
n_tup_del         | 941176496
n_tup_hot_upd     | 0
n_live_tup        | 688858417
n_dead_tup        | 940727818
last_vacuum       |
last_autovacuum   |
last_analyze      |
last_autoanalyze  | 2014-08-09 01:36:21.703+01
vacuum_count      | 0
autovacuum_count  | 0
analyze_count     | 0
autoanalyze_count | 69
11
Barry

Je regarderais partitionnement . Si séparé par jour, vous pouvez simplement laisser tomber la partition entière une fois qu'il devient trop vieux. Vous ne pouvez même plus avoir à aspirer.

En outre, la performance globale pourrait augmenter, car vous n'ez pas l'insertion où vous supprimez. Vous auriez juste besoin d'écrire le code pour créer de nouvelles partitions et supprimer des anciens.

C'est exactement ce que le partitionnement est pour.

2
SQB