首页 > 解决方案 > 如何加快 PostgreSQL 中的 INSERT 请求?

问题描述

PostgreSQL数据库中,我有这样的表:

CREATE TABLE IF NOT EXISTS layers (ID NUMERIC, GEOM GEOMETRY, CITY VARCHAR, AGGREGATION_METHOD VARCHAR, INFO JSON);

~700我正在尝试使用这样一个查询向该表中插入记录:

INSERT INTO layers (ID, GEOM, CITY, AGGREGATION_METHOD, INFO) VALUES
(107509018555, '0203000020E61000000100000005000000000000808531534000000020749D4540000000808531534000000080159E4540000000201731534000000080159E4540000000201731534000000020749D4540000000808531534000000020749D4540', 'New York', 'MONTHLY', '[{"time":"2019-10-01T00:00:00Z","gender_details":[{"gender":"Male"},{"gender":"Female"}]}]'),
(107509018556, '0303000020E610000001000000050000000000008085315340000000A0D29A4640000000808531534000000020749D4540000000201731534000000020749D45400000002017315340000000A0D29C45400000008085315340000000A0D29C4540', 'London', 'MONTHLY', '[{"time":"2019-10-01T00:00:00Z","gender_details":[{"gender":"Male"},{"gender":"Female"}]}]')
... other 698 values

该查询运行 9-10 秒。有没有办法加快 PostgreSQL 数据库中的插入请求?

PostgreSQL 版本:11.0(在 Red Hat 上运行)

查询计划: 在此处输入图像描述

标签: sqlpostgresqlsql-insert

解决方案


  1. 如果您的表上有任何索引或外键,它们肯定会减慢执行速度。您可能会考虑将数据插入表中而不使用索引,然后再创建索引。检查是否还有任何触发器。
  2. 您也可以尝试使用COPY命令加载数据。它比 INSERT 快。
  3. 如果您的磁盘速度较慢,这可能是个问题,您可以尝试使用UNLOGGED表,以便在加载操作期间生成更少的 WAL 段。但是请注意,这种方法也有缺点。

题外话:考虑使用JSONB类型而不是 JSON。


推荐阅读