Postgres Upsert - проблемы фрагментации - PullRequest
0 голосов
/ 14 января 2020

Сводка

Я использую Postgres UPSERT в наших ETL, и у меня возникают проблемы с фрагментацией и раздутием в таблицах, в которые я пишу, что замедляет все операции включая чтение.

Контекст

У меня есть ежечасные ETL-файлы, загружаемые в таблицы (таблицы ~ 10 с миллионов, upserts ~ 10 с тысяч), и мы установили автоматический вакуум на пороги на AWS.

Мне пришлось запустить ПОЛНЫЙ вакуум, чтобы вернуть пространство назад и предотвратить зависание процессов. Сейчас это усугубляется, поскольку частота одного из наших ETL увеличилась, что заполняет некоторые базовые таблицы, которые являются источником ряда денормализованных представлений. Похоже, что происходит то, что таблицы не имеют возможности пылесосить перед следующим запуском ETL, что создает спираль, которая в конечном итоге приводит к полному замедлению.

Вопрос!

Оказывает ли Upsert фундаментальное негативное влияние на фрагментацию, и если да, то что используют другие люди? Я заинтересован в том, чтобы реализовать некоторые материализованные представления и переместить большинство наших индексов в новые представления, сохраняя при этом только индекс PK для таблиц, в которые мы пишем, но я не уверен, что это решит проблему, которую я вижу с раздуванием .

Я немного прочитал этот вопрос, но ничего не решено, например -> https://www.targeted.org/articles/databases/fragmentation.html

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Непонятно, что вы на самом деле видите. Можете ли вы включить track_io_timing, а затем выполнить EXPLAIN (ANALYZE, BUFFERS) для запроса, который, по вашему мнению, был замедлен из-за раздувания?

Раздувание и фрагментация - это не одно и то же. Фрагментация больше связана с индексами при некоторых условиях, а не с самими таблицами.

Похоже, что происходит то, что таблицы не имеют возможности вакуумироваться до следующего запуска ETL

Это может быть очень легко исправить. Запустите «ручной» VACUUM (не VACUUM FULL) в конце или в начале каждого запуска ETL. Поскольку у вас есть четко определенный рабочий процесс, вам не нужно пытаться заставить autovacuum делать правильные вещи, так как в ваш рабочий процесс должно быть очень легко добавлять вакуум вручную. Или вы думаете, что один ВАКУУМ на ETL является излишним?

0 голосов
/ 14 января 2020

Это зависит. Если нет никаких ограничений ограничения, INSERT ... ON CONFLICT не вызовет раздувания. Если он выполнит обновление, он выдаст пустую строку.

Меры, которые вы можете предпринять:

  • установите autovacuum_vacuum_cost_delay = 0 для ускорения автоочистки

  • используйте fillfactor несколько меньше 100 и не имеют индекса для обновленных столбцов, так что вы можете получать обновления HOT, которые делают ненужным автоматическое вакуумирование

...