Почему PostgreSQL не может выполнять параллельный DML?

#postgresql

Вопрос:

В настоящее время я нахожу некоторые функции в нашем проекте, которые открывают несколько SPI для вставки в таблицу или удаления из нее, и я думаю, что они ошибочны. Однако в прошлом функции, похоже, работали нормально, что привело меня к этому вопросу.

Согласно некоторой информации, которую я собрал из Интернета, кажется безопасным, когда несколько работников одновременно обновляют данные в разных частях таблицы или вставляют данные без требования порядка.

Однако я нахожу, что PostgreSQL в настоящее время просто отключает параллельность в любом операторе DML. Я не уверен, в чем причина этого. Вызовет ли параллельный DML мертвые блокировки? или при каких условиях было бы безопасно открывать параллель?

Комментарии:

1. Что вы считаете параллельным DML? Один оператор DML, выполняемый с несколькими потоками/процессами? Или несколько операторов DML, работающих с одной и той же таблицей одновременно?

2. @a_horse_with_no_name Оба. Первая похожа на типичную команду «вставить…выбрать», в которой можно распараллелить только выбранную часть. А второе похоже на открытие нескольких SPI в пользовательской функции. Оба они сейчас не поддерживаются PG.

3. Для первого из них ответ на вопрос «почему?» довольно прост: потому что до сих пор его никто не реализовал. Скорее всего, это также ответ на второй вопрос.