Массовая вставка в postgresql с подготовленными утверждениями - PullRequest
0 голосов
/ 24 октября 2019

Я использую libpq (но потенциально могу быть готов переключиться на другую библиотеку)

У меня есть несколько похожих запросов INSERT, которые я хочу сделать, они отличаются только значениями между ними.

Я хотел бы использовать подготовленные операторы, чтобы избежать проблем с экранированием полей. Я также хочу отправить их в одном пакете, чтобы не тратить туда и обратно на каждый запрос.

Мне известны только следующие параметры:

Использовать PQExec() с несколькими вставками, разделенными точкой с запятой: Это не позволяет подготовить операторы, поэтому мне нужно создать запрос динамически

Использовать PQexecParams() для каждого запроса отдельно: Это приводит к проблемам из-за нескольких потраченных туда-обратно

Использовать PQprepare() + PQExecPrepared() для каждого запроса в отдельности: та же проблема, что и в предыдущем

Используйте PQexecParams() для одного запроса с несколькими вставленными строками, например INSERT INTO tablename (a,b,c) VALUES ("A", "B", "C"), ("aa", "bb", "cc"): это немного лучше, чем первый вариант, потому что он позволяет не экранировать аргументы,но все равно требует динамического построения запроса (и в худшем случае вам придется увеличивать количество аргументов ($ 1, $ 2, $ 3) для первой строки, но ($ 4, $ 5, $ 6) для второй и т. д.)

Итак, как избежать этих недостатков?

1 Ответ

0 голосов
/ 01 ноября 2019

Вы хотите использовать свой последний вариант, один оператор INSERT, чтобы вставить несколько строк. Однако добавление все большего количества строк в конечном итоге не даст вам дополнительного увеличения скорости. Это происходит, когда производительность в основном определяется базой данных, а не сетью или другими факторами. Допустим, это происходит около 20 строк.

Вы можете создать один подготовленный оператор для вставки 20 строк. Выполняйте это столько раз, сколько вам нужно.

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

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

См. Также этот ответ и ссылки, содержащиеся в нем, для получения дополнительных советов о том, как ускорить массовые вставки.

...