Можно ли гарантировать минимальное установленное количество рабочих для параллельной агрегатной функции в postgres?

#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 in psql , чтобы увидеть параметры хранилища, или SELECT reloptions FROM pg_class WHERE relname = 'table_name'; . parallel_workers это просто переопределение для обычной логики оптимизатора, основанной на min_parallel_table_scan_size , но оно превзойдено max_parallel_workers_per_gather и max_parallel_workers .