В какой степени PostgreSQL поддерживает параллельный DDL? - PullRequest
3 голосов
/ 21 февраля 2020

Если посмотреть здесь , то ясно, что Oracle поддерживает выполнение команд DDL параллельно с четко указанным сценарием ios. Мне было интересно, действительно ли Postgres предлагает такую ​​функциональность? Я могу найти много материала о «параллельных запросах» для PostgreSQL, но не так много, когда задействован DDL.

Например, могу ли я выполнить несколько 'CREATE TABLE...AS SELECT' параллельно? И если нет, как я могу достичь такой функциональности? Что произойдет, если у меня будет временная таблица (CREATE TEMP TABLE)? Нужно ли что-то настраивать для блокировок?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Это общие c операторы DDL, они являются операциями индекса и операциями секционирования, которые могут быть распараллелены.

Если вы посмотрите раздел Notes оператора CREATE INDEX , вы увидите, что поддерживается параллельное построение индекса:

PostgreSQL can создавать индексы, используя несколько процессоров, чтобы быстрее обрабатывать строки таблицы. Эта функция известна как параллельный индекс сборки . Для методов индекса, которые поддерживают построение индексов параллельно (в настоящее время только B-дерево), maintenance_work_mem указывает максимальный объем памяти, который может использоваться каждой операцией построения индекса в целом, независимо от того, сколько рабочих процессов было запущено. Как правило, модель затрат автоматически определяет, сколько рабочих процессов следует запрашивать, если таковые имеются.

Обновление

Я подозреваю, что real вопрос о CREATE TABLE ... AS хотя.

Это, по сути, CREATE TABLE, за которым следует INSERT .. SELECT. Часть CREATE TABLE не может быть распараллелена и не обязана - по сути, это операция метаданных. С другой стороны, SELECT, можно легко распараллелить . INSERT немного сложнее, но это вопрос реализации.

Как a_horse_with_no_name объясняет в комментарий к этому вопросу , параллелизация для CREATE TABLE AS была добавлена ​​в PostgreSQL 11 :

Улучшения в параллелизме, включая:

  • CREATE INDEX теперь может использовать параллельную обработку при построении индекса B-дерева
  • Параллелизация теперь возможна в CREATE TABLE ... AS, CREATE МАТЕРИАЛИЗИРОВАННЫЙ ВИД, а также некоторые запросы с использованием UNION
  • Распараллеленные объединения ha sh и параллельное последовательное сканирование теперь работают лучше
1 голос
/ 21 февраля 2020

С здесь :

Даже если в общем случае возможно создание параллельных планов запросов, планировщик не будет генерировать их для данного запроса, если какой-либо из верно следующее:

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

(выделено мое).

Что, по-видимому, предполагает, что Postgres не будет "распараллеливаться "любой запрос, который изменяет структуру базы данных, при любых обстоятельствах.

Для одновременного выполнения нескольких запросов в Postgres требуется одно соединение на каждый выполняемый запрос .

...