在循环的每一步插入



Postgres中的循环显然仅在循环完成时进行批量插入。我想在每个循环步骤中执行此操作。例如:

CREATE OR REPLACE FUNCTION harmonize () RETURNS integer AS $$
  DECLARE
  BEGIN
  FOR i in 1..1000000 LOOP
     INSERT INTO test VALUES (1000, 'some name', 1978002939, 1978002930, 0.0);
  END LOOP;
  RETURN 1;    
  END;
$$ LANGUAGE plpgsql VOLATILE;

我希望在所有百万步结束之前查看表中的记录。

你不能在这种函数中这样做,因为PostgreSQL中的语句在单个事务中运行。仅当语句结束时没有错误时,其他客户端才能看到任何更改。

例如,您可以使用扩展名解决此问题postgres_fdw。它可以连接到自身并在每个循环步骤中执行插入和提交。但它的效率极低——比如慢 1000 倍。而且很难以安全的方式进行配置。

你可以让它不那么痛苦,你在浴缸里做这个插入。比如:开始事务,插入1000行,提交,重复。

相反,我会在外部程序中实现这样的东西:

  • set synchronous_commit=off;
  • 使用COPY而不是INSERT;
  • copy,比如说,1000行,并在每批后提交。

最新更新