#postgresql #postgresql-12 #postgresql-13
#postgresql #postgresql-12 #postgresql-13
Вопрос:
У меня есть пользовательское параллельное агрегатное расширение для Postgresql, и я хотел бы, чтобы по крайней мере N рабочих процессов выполняли агрегацию каждый раз, когда используется агрегатная функция.
Можно ли указать postgresql ВСЕГДА использовать как минимум N рабочих для этой функции?
Ответ №1:
Что вы можете сделать, это установить параметр хранилища parallel_workers
в таблице. Тогда при каждом параллельном сканировании этой таблицы используется такое количество рабочих элементов. Но это невозможно сделать для каждой функции, что имеет смысл, потому что от таблицы зависит, полезен ли параллелизм или нет.
Кроме того, вы никогда не сможете гарантировать, что всегда используется определенное количество рабочих, потому что в масштабах кластера максимальное количество параллельных рабочих max_parallel_workers
, и если этот предел достигнут, вы не получите параллельного рабочего, даже если оптимизатор хотел бы распараллелить.
Я бы просто оставил это решение оптимизатору.
Комментарии:
1. Понятно. Я думал
parallel_workers
, что это общесистемная вещь, а не для каждой таблицы. Как мне спросить мою таблицу, каково ее текущееparallel_workers
значение?2. Вы можете использовать
d table_name
inpsql
, чтобы увидеть параметры хранилища, илиSELECT reloptions FROM pg_class WHERE relname = 'table_name';
.parallel_workers
это просто переопределение для обычной логики оптимизатора, основанной наmin_parallel_table_scan_size
, но оно превзойденоmax_parallel_workers_per_gather
иmax_parallel_workers
.