Общий параллелизм с CTE PostgreSQL

Я работаю с большими данными, и мне необходимо получать параллельные планы в моих запросах. Я также очень люблю использовать CTE для выражения своих запросов, но, следуя документации PostgreSQL, я не уверен, создают ли CTE серьезные ограничения для параллелизма или нет.

Здесь CTE и временные таблицы помечены как "с ограниченным параллелизмом", где "с ограничением по параллельности" определяется как

Параллельная ограниченная операция - это операция, которая не может быть выполнена в параллельном работнике, но может выполняться в ведущем, пока используется параллельный запрос.

Здесь описание ограничений параллелизма в том, что касается CTE, немного иное:

Если запрос содержит операцию изменения данных либо на верхнем уровне, либо в CTE, параллельные планы для этого запроса не будут созданы.

В моем случае у меня нет операций по изменению данных.

В какой степени CTE ограничат качество моего параллельного плана, если вообще?

Честно говоря, мне было трудно понять значение первого определения. Поскольку CTE могут быть материализованы как временные таблицы, я уверен, что это влияние еще более актуально. И второе определение предполагает, что ограничения параллелизма CTE связаны только с операциями изменения данных.

1 ответ

Использование CTE нормально и в большинстве случаев не препятствует параллельному выполнению.

Ограничение состоит в том, что CTE находится в состоянии частного процесса параллельного ведущего процесса, поэтому параллельные рабочие не могут его сканировать. Помимо этого, PostgreSQL с радостью сгенерирует параллельный план.

Таким образом, следует избегать таких запросов, как

WITH a AS (SELECT ...)
SELECT ... FROM a JOIN b ...

если вы хотите, чтобы соединение было распараллелено. Запрос внутри CTE можно распараллелить (я думаю) и сканироватьb также можно распараллелить.

Для оптимального распараллеливания вы можете попробовать переписать запрос как

SELECT ...
FROM (SELECT ...) AS a
   JOIN b ...
Другие вопросы по тегам