SELECT
查询与大量工作人员一起运行“并行序列”扫描。现在,当此查询用作 UPDATE
中的子查询时,它会回归到“Seq”扫描,即非并行。
FOR
循环或游标将进行单个提交而不是批量提交,这再次减慢了我们的速度。
提示:它有数百万条记录在选择并更新数百万条记录
UPDATE user
SET user_type = select_user_type
FROM (
SELECT id as select_id, user_type as select_user_type FROM txn join meta using(id)
)
WHERE select_id = id;
这是什么原因,如何改善?性能变慢 300 倍。
任何
INSERT
、UPDATE
或 DELETE
语句都无法在 PostgreSQL 中使用并行查询,因此您永远无法对子查询进行并行处理。
但是,我不确定这是否是您的问题。如果你说它慢了300倍,那很难用缺乏并行性来解释。瓶颈很可能是
UPDATE
。您可以通过查看语句 EXPLAIN (ANALYZE, BUFFERS)
的结果来验证这一点。
我可以给你一些提高表现的想法:
检查桌子上是否有您
UPDATE
的触发器,如果有,请尝试使其尽可能快。
表上不要有太多索引,因为它们会减慢更新速度。
要实现并行化,您必须打开多个数据库连接并并行运行多个此类
UPDATE
语句。您可以添加 WHERE
条件来划分负载,例如WHERE id BETWEEN 100001 AND 200000
或 WHERE id % 5 = 2
。