使用 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 范围内具有更高的标准偏差每个人都打电话。
为了减少我的数据库上的一些查询负载,我目前将多个查询合并为一个 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 范围内具有更高的标准偏差每个人都打电话。