С обработчиками сторонних данных PostgreSQL при вставке более эффективно вставлять строки массово?

Итак, если у меня есть несколько записей, которые я хочу вставить во внешнюю таблицу, я могу сделать это (псевдокод):

DO
    INSERT INTO my_fdw_table VALUES next_row;
LOOP

или это:

INSERT INTO my_fdw_table SELECT all_the_rows;

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

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

Я использую постгрес 9.3.


person Jordan Morris    schedule 04.10.2015    source источник
comment
Массовая вставка почти всегда выполняется существенно быстрее, чем вставка одной строки. но это не отвечает на более интересный вопрос, как именно внешние таблицы обрабатывают объемную вставку внутри...   -  person Erwin Brandstetter    schedule 04.10.2015
comment
Вероятно, вы правы, но вы не узнаете этого, пока не измерите производительность.   -  person Bill    schedule 04.10.2015


Ответы (1)


Разница не будет огромной, потому что даже массовое INSERT приведет к множеству одиночных INSERT на внешнем сервере, поэтому в обоих случаях будет одинаковое количество циклов.

Если вообще есть измеримая разница, я подозреваю, что это связано с тем, что код клиента или PL/pgSQL, обрабатывающий цикл INSERT, занимает некоторое время. Конечно, если вы делаете что-то вроде запуска каждого INSERT в отдельной транзакции или используете динамический SQL для оператора INSERT, из-за этого вы будете работать медленнее.

person Laurenz Albe    schedule 10.10.2016
comment
Разве многие вставки не будут выполняться локально (локально на внешнем сервере - в основном, туда и обратно на диск) намного быстрее, чем множество сетевых циклов? - person Jordan Morris; 11.10.2016
comment
Да, они были бы, но это не так. Каждая вставленная строка требует кругового пути между локальным и удаленным сервером. Единственная спасительная грация состоит в том, что можно использовать подготовленные операторы. - person Laurenz Albe; 11.10.2016