Как ускорить работу слота репликации на PostgreSQL?

Я создал слот репликации:
select * from pg_create_logical_replication_slot('slot1', 'test_decoding');

У меня есть "широкая" таблица на 150 полей в которой хранится примерно 500 млн. записей.

Примерно раз-два в месяц происходит крупный update на 50 млн. записей,
для слота репликации происходит крупная транзакция с 50 млн. операциями.

Если выполнить запрос select * from pg_logical_slot_peek_changes('slot1', NULL, NULL);,
то должно получиться примерно следующее:

BEGIN 68354590
UPDATE: id[integer]:1 col_1[character varying]:'text1' ... col_150[character varying]:'text150'
...
UPDATE: id[integer]:50000000 col_1[character varying]:'text1' ... col_150[character varying]:'text150'
COMMIT 68354590

Но у меня не происходит ничего, запрос просто не может выполниться.
Как можно улучшить производительность слота репликации чтобы можно было забирать изменения?
  • Вопрос задан
  • 305 просмотров
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Скорей всего упираетесь в производительность IO на временных файлах, увеличение logical_decoding_work_mem с этим должно помочь.
Затем посмотрите, не упираетесь ли в 100% cpu на этом процессе. logical decoding однопоточный, ему важна производительность в один поток. Тут ничего не поможет. Прочитать, понять и переупорядочить данные среди гигабайтов wal'ов всё равно придётся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы