Общий параллелизм с 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 ...