Следующий ответ в основном относится к внешней оболочке данных для PostgreSQL, postgres_fdw
.
Если вам нужна информация о других оболочках сторонних данных, это зависит от реализации оболочки сторонних данных и возможностей базового хранилища данных. Например, чтобы иметь одновременные (чтение) запросы с file_fdw
, вам нужна файловая система, которая позволяет двум процессам одновременно открывать файл для чтения.
Параллелизм запросов к одной и той же внешней таблице аналогичен локальным таблицам. Это удаленный сервер, который обрабатывает операторы SQL, блокирует измененные строки до завершения транзакции и тому подобное.
Таким образом, может быть произвольно много одновременных читателей, и читатели не будут блокировать писателей, и наоборот.
Если вы запускаете UPDATE
s или DELETE
s с WHERE
условиями, которые не могут быть переданы на внешний сервер (проверьте план выполнения), может случиться так, что у вас будет больше блокировок, чем при использовании локальной таблицы.
Представьте такой запрос:
UPDATE remote_tab SET col = 0 WHERE <complicated condition that is true for only one row>;
В локальной таблице это заблокирует только одну строку.
Если условие слишком сложное, чтобы его можно было передать на внешний сервер, postgres_fdw
сначала выполнит такой запрос:
SELECT ctid, col FROM remote_tab FOR UPDATE;
Это позволит получить и заблокировать все строки таблицы.
Затем условие WHERE
будет применено локально, а результирующая строка будет обновлена на внешнем сервере:
UPDATE remote_tab SET col = 0 WHERE ctid = ...;
Так что в этом случае параллелизм и производительность могут сильно пострадать.
person
Laurenz Albe
schedule
15.03.2017