如何提示内部选择查询并行运行以进行批量更新

问题描述 投票:0回答:1

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 倍。

postgresql query-optimization postgresql-parallel-query
1个回答
0
投票

任何

INSERT
UPDATE
DELETE
语句都无法在 PostgreSQL 中使用并行查询,因此您永远无法对子查询进行并行处理。

但是,我不确定这是否是您的问题。如果你说它慢了300倍,那很难用缺乏并行性来解释。瓶颈很可能是

UPDATE
。您可以通过查看语句
EXPLAIN (ANALYZE, BUFFERS)
的结果来验证这一点。

我可以给你一些提高表现的想法:

  • 检查桌子上是否有您

    UPDATE
    的触发器,如果有,请尝试使其尽可能快。

  • 表上不要有太多索引,因为它们会减慢更新速度。

  • 要实现并行化,您必须打开多个数据库连接并并行运行多个此类

    UPDATE
    语句。您可以添加
    WHERE
    条件来划分负载,例如
    WHERE id BETWEEN 100001 AND 200000
    WHERE id % 5 = 2

© www.soinside.com 2019 - 2024. All rights reserved.