2

为了减少我的数据库上的一些查询负载,我目前将多个查询一起批处理为一个INSERT具有可变行数的查询。这会产生如下查询:

INSERT INTO example_table (column_1, column_2, ...)
VALUES ($1, $2, ...), ($3, $4, ...), ($5, $6, ...), ...
RETURNING "id";

由于行数不同,从pg_stat_statements扩展的角度来看,看起来运行了许多不同类型的查询。

我希望有效地批量插入几行,同时允许pg_stat_statements将所有查询统计信息整齐地聚合在一起。有什么方法可以用来实现这一点,也许是通过告诉pg_stat_statements这些都是相同的查询类型或使用准备好的语句?

4

1 回答 1

2

我通过插入带有 的行来解决这个问题,UNNEST无论插入的行数如何,都可以实现一致的查询形状。

INSERT INTO example_table (column_1, column_2, ...)
  (SELECT * FROM UNNEST($1::uuid[], $2::varchar[], ...));

UNNEST工作,因为我不需要DEFAULT在我的任何行中使用。在某些情况下,数组强制转换不是必需的,但我将它们添加为明确的。某些类型也需要它们,例如uuid[].

对于我的用例,性能与INSERT具有多个VALUE元组的查询相当:UNNEST平均速度更快,但在每个约 60 万次调用中具有更高的标准偏差。

于 2019-08-29T04:29:21.707 回答