使用 pg_stat_statements 可以聚合的查询有效地将可变数量的行插入 Postgres

Efficiently inserting a variable number of rows into Postgres with a query that pg_stat_statements can aggregate

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

INSERT INTO example_table (column_1, column_2, ...)
VALUES (, , ...), (, , ...), (, , ...), ...
RETURNING "id";

因为行数不同,从pg_stat_statements扩展的角度来看,看起来很多不同类型的查询都是运行.

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

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

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

UNNEST 之所以有效,是因为我不需要在我的任何行中使用 DEFAULT。在某些情况下,数组转换不是必需的,但我将它们添加为显式。某些类型也需要它们,例如 uuid[].

对于我的用例,性能与具有多个 VALUE 元组的 INSERT 查询相当:UNNEST 平均速度更快,但在大约 600k 范围内具有更高的标准偏差每个人都打电话。