【问题标题】:Bulk insert with returning IDs performance具有返回 ID 性能的批量插入
【发布时间】:2013-10-23 06:55:31
【问题描述】:

我有一个表,我想在每个查询中插入大约 1000 个项目,并在创建后获取它们的 PK,以供以后用作其他表的 FK。

我尝试在 postgresql 中使用 returning 语法插入它们。 但插入大约需要 10 秒

INSERT INTO table_name (col1, col2, col3) VALUES (a1,a2,a3)....(a(n-2),a(n-1),a(n)) returning id;

通过删除RETURNING,我获得了更好的性能~50ms。

我认为,如果我可以通过原子操作获取第一个 id 并同时插入行,我可以通过删除 RETURNING 获得更好的性能。 但不明白这是否可能。

【问题讨论】:

  • 一般RETURNING ID 不会显着减慢插入速度。你能展示一个可重现的案例吗?
  • @DanielVérité 似乎我从另一个查询而不是从插入中获得了较慢的性能。
  • @shevski 你能澄清一下吗?这是否意味着您最终发现有和没有RETURNING 的性能相同?
  • @CharlBotha 嗯,这是一篇旧帖子,但我记得我有类似的表现

标签: python sql database postgresql psycopg2


【解决方案1】:

使用 nextval 生成 id http://www.postgresql.org/docs/9.1/static/sql-createsequence.html

CREATE TEMP TABLE temp_val AS(
    VALUES(nextval('table_name_id_seq'),a1,a2,a3), 
        (nextval('table_name_id_seq'),a1,a2,a3) 
);
INSERT INTO table_name (id, col1, col2, col3)(
    SELECT column1,column2,column3,column4 
    FROM temp_val
);
SELECT column1 FROM temp_val;

【讨论】:

  • @shevski 是的:nextval() 结果不会被其他并发会话使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2016-07-27
  • 2013-07-12
  • 2011-02-28
相关资源
最近更新 更多