使用准备好的语句大容量插入到postgresql

Bulk insert to postgresql with prepared statement(s)

本文关键字:插入 postgresql 大容量 语句 准备好      更新时间:2023-10-16

我正在使用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(,等等(

那么,如何避免这些弊端呢?

您希望使用最后一个选项,一个INSERT语句来插入多行。然而,添加越来越多的行最终不会给您带来额外的速度提升。当性能主要由数据库决定,而不再由网络或其他因素决定时,就会发生这种情况。假设这种情况发生在20排左右。

您可以创建一个准备好的语句来插入20行。根据需要多次执行此操作。

对于任何剩余的行,您必须创建一个新的prepared语句来插入剩余的行。

您可以在不准备语句的情况下使用相同的方法,但您必须转义所有值,正如您已经提到的那样。然而,如果这是一个非常具体的情况,这可能不是一个问题。

有关如何加快批量插入速度的更多建议,请参阅此答案以及其中包含的链接。