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行,并在每批后提交。