目标

我想为可布线图中的每一对顶点运行pgr_dijkstra.我有一个简单的脚本,它获取每一对顶点并对数据库启动pgr_dijkstra.

这将是很好的使用PostgreSQL parallel query的能力来加速它.

我想实现一个"容易"的速度,而不需要实现像contractions这样的高级代码.

问题

尽管我可以看到,对于我的一些表,explain analyze显示了一个涉及GatherParallel Seq Scan的计划,但try 在启用"并行"参数和PARALLEL SAFE关键字的情况下运行pgr_dijkstra实际上会使运行速度变慢.

输入数据

我有一个启用了PostGIS的数据库,其中有大约OSM个数据是用osm2pgsql导入的:

Data Size
Nodes (vertices) table 730 vertices
Nodes (vertices) table 160 kB
Edges table 1100 vertices
Edges table 656 kB

PostgreSQL和系统配置

CPU:第11代英特尔酷睿i7-1165G7

PostgreSQL parameter Value
min_parallel_table_scan_size 8kB
force_parallel_mode off
parallel_setup_cost 10
parallel_tuple_cost 0.001
max_parallel_workers_per_gather 8
max_parallel_workers 8
max_worker_processes 8

我已经将force_parallel_mode设置为每this recommendationoff,但即使是on也没有什么不同.

parallel_tuple_cost从缺省值更改为0.001 does not seem to help.

查询和结果

我已经设置了一个非常简单的pgr_dijkstra呼叫,有SAFE和没有SAFE,源/目标顶点的id都是硬编码的:

CREATE OR REPLACE 
FUNCTION pgr_parallel() 
RETURNS VOID 
AS $$
    BEGIN
    PERFORM pgr_dijkstra(
    '
      SELECT gid AS id,
        source,
        target,
        length_m AS cost
      FROM edges_table 
      WHERE
                        NOT source IS NULL
                        AND
                        NOT target IS NULL
                        AND
                        NOT the_geom IS NULL
                        AND NOT length_m IS NULL
    ',
    ARRAY[161]
    ,
    ARRAY[639]
   ,
    directed := false
    );
    END;
$$ LANGUAGE 'plpgsql'
PARALLEL SAFE;

我有一个简单的脚本,它调用这个函数N次,它似乎不是以并行的方式运行的:

Type of function Number (N) of pairs of vertices Execution time
undefined (not parallel) 50,000 67 seconds
PARALLEL SAFE 50,000 89 seconds

作为额外的观察,我运行htop并看到在开始时,当(并行)脚本运行时,所有8个物理核心都被使用了.但是,当脚本完成向数据库发送"任务"时,htop显示postgres进程只使用一个内核.

问题

如果我理解正确的话,如果有一些有意义的independent work to be done by each worker,那么查询可以被‘并行化’.在pgr_dijkstra和任何其他最短路径查找算法的情况下,情况不是这样吗?我假设pgr_dijkstra会获取顶点和边,然后对它们运行独立的计算.

是否有可能利用PostgreSQLparallel query功能,使pgr_dijkstra的至少某些部分能够并行运行?若有,如何处理?

Crunchy Data和Paul Ramsey在this post中使用了Note:,PARALLEL SAFE用于包含pgr_dijkstra的函数,但由于这一点,它是否运行得更快没有细节.

推荐答案

运行\df+ pgr_dijkstra;,我们看到该函数是parallel unsafe,所以不能在单个查询中将其并行化.

但是,您可以try 使用多个连接并行运行多个查询(即在不同的顶点对之间).但请记住,它们将为同样的资源而竞争.

Postgresql相关问答推荐

为什么Postgres优化器切换到嵌套循环进行连接?

将XML解析从T-SQL迁移到Postgres时出现问题

如何删除Devtainer之前创建的PostgreSQL数据库?

sqlalchemy在Flask 下运行时出现无法解释的错误

将整数(以毫秒为单位的epoch时间)转换为PrimitiveDateTime

错误:用户需要系统密码:postgres

安装age-installation时出错

PostgreSQL中如何在同一行中存储多个与单个值相关的ID?

是否可以短时间运行 VACUUM FULL 并获得一些好处?

PostgreSQL ,从 2 个表中 Select ,但仅从表 2 中 Select 最新的元素

如何防止materialized 视图在 pg_restore 期间刷新?

sql语句错误:column .. does not exist

PostgreSQL:如何安装 plpythonu 扩展

无法使用 sequelize 从本地 node 应用程序连接到 heroku postgresql 数据库

Postgres NOT IN (null) 没有结果

返回 array_agg() 中的第一个元素

使用 PostgreSQL 创建数据透视表

如何缩小 pg_toast 表?

查询 JSON 列中的数组元素

处理用户发送的string contains null byte