Зайнятий стіл не пилососиться


11

Ми використовуємо Postgres 9.2 в Windows для зберігання даних із низькочастотними хронометражами: ми вставляємо близько 2000 рядків в секунду кожні другі 24 години 7 днів на тиждень без простоїв. Існує такий, DELETEякий працює на столі кожні 10 хвилин або близько того, щоб тримати стіл до фіксованої кількості днів. Це в кінцевому підсумку є досить стабільним 900 мільйонів рядів. (Для тих , хто зацікавлений, SELECT, INSERT, DELETEвсе продуктивний).

Таким чином DELETE, видалення рядків не звільняє місце на диску. Для цього нам потрібно VACUUMбігти.

Я запитував pg_stat_user_tablesі, VACUUMздається, ніколи не запускався.

Що я розумію з різних документів ( http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html ):

  • у нас, здається, увімкнено автоматичне вакуумування, і він працює на інших таблицях.
  • автоматичний вакуум не працює FULLі не повинен вимагати ексклюзивного блокування на столі.

Хтось має думки, чому не працює автоматичний вакуум? Це виключно тому, що стіл постійно зайнятий?

І чи варто бігати VACUUMпісля кожного DELETEв цьому випадку (який працює кожні 10 хвилин)?

Редагувати:

Запит за допомогою SQL за посиланням SO нижче:

-[ 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       | *

та вихід сировини:

-[ 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

4
Див. Агресивний Autovacuum на PostgreSQL . Також було б цікаво мати select * from pg_stat_user_tablesцю таблицю (використовуйте \xв psql для добре відформатованого виводу)
Daniel Vérité

2
Це посилання є корисним і, можливо, відповідає на питання - стіл занадто зайнятий, щоб авто-вакуум працював. @ DanielVérité Я оновив питання з результатами, про які ви просили.
Баррі

3
Це багато мертвих кортежів! Якщо можливо, розгляньте розділення таблиці за часовою позначкою та скидання старих розділів замість видалення. Найважливішим застереженням є те, що унікальний індекс у розділах не підтримується.
Даніель Верете

1
Чи скасовується файл журналу повідомлень про автовакуму в цій таблиці?
jjanes

@jjanes Ні - у журналах не було вказівки на те, що автовакуум колись починався.
Баррі

Відповіді:


2

Я б розглядав розділення . Якщо розділити день, ви можете просто скинути весь розділ, коли він стане занадто старим. Можливо, вам навіть більше не доведеться пилососити.

Також загальна ефективність може збільшитися, оскільки ви не вставляєте туди, де видаляєте. Вам просто потрібно буде написати код для створення нових розділів та видалення старих.

Це саме те, для чого призначений розподіл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.