【问题标题】:PostgreSQL: running SQL statements in parallel in a SQL scriptPostgreSQL:在 SQL 脚本中并行运行 SQL 语句
【发布时间】:2021-10-28 19:19:06
【问题描述】:

我在脚本中使用 for 循环根据系列中的值计算几何,并将结果插入表 (t1)。有没有办法使用并行性重写下面的循环?使用什么方法?我发现了很多关于 PostgreSQL 如何并行运行查询的文档,但是对于我如何执行这样的任务却很难。甚至可以使用 SQL 吗?还是我应该依赖 Python 等其他语言,并从那里执行 SQL 查询?

DO $$
DECLARE
  lims int[];
  lim int;
BEGIN
  SELECT ARRAY(SELECT generate_series(60, 300, 60)) INTO lims;
  CREATE TABLE t1(
    lim integer,
    the_geom geometry(polygon, 4326),
  );
  FOREACH lim IN ARRAY lims
  LOOP
    WITH conv_hull AS (
      SELECT ST_ConcaveHull(...I use lim here...) AS conv_hull
    )
    INSERT INTO t1 (lim, the_geom) SELECT lim, ST_SetSRID(conv_hull.ST_ConcaveHull, 4326) FROM conv_hull;
  END LOOP;
END $$;

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    Postgres 中的并行性是查询规划器为您处理大型、合格的 SQL 语句的事情。您不能在 PL/pgSQL 中按需启动并行操作。

    您可以重写您的示例,用纯 SQL 中基于集合的解决方案替换 PL/pgSQL 循环,例如:

    BEGIN;
    
    CREATE TABLE t1(
      lim integer
    , the_geom geometry(polygon, 4326)
    );
    
    WITH conv_hull AS (
       SELECT ST_ConcaveHull(...) AS conv_hull
       )
    INSERT INTO t1 (lim, the_geom)
    SELECT generate_series(1,10), ST_SetSRID(conv_hull.ST_ConcaveHull, 4326)
    FROM   conv_hull;
    
    COMMIT;
    

    如果您的服务器配置正确,查询变得足够大,并且所有涉及的操作都允许并行,那么规划器将调度多个工作进程 - 如果资源可用,则实际启动它们。

    generate_series()PARALLEL SAFE,对于初学者来说。阅读manual chapter "Parallel Query"中的详细信息。

    【讨论】:

    • 谢谢,问题是我需要“WITH conv_hull AS (SELECT ST_ConcaveHull(...) AS conv_hull) 语句中的 lim 值。我的问题不清楚,我对其进行了编辑。 ..
    • @Marc:如果将generate_series()移动到FROM部分,就可以像列一​​样访问生成的数字。
    【解决方案2】:

    好的,谢谢!我得到了完整的声明:

    SELECT ST_ConcaveHull(the_geom, 0.95) FROM (
      SELECT ST_Union(b.the_geom) AS the_geom
      FROM generate_series(60, 300, 60) AS lim, pgr_drivingDistance(
        'SELECT id, source, target, cost, reverse_cost FROM edge_net', vid, lim, true
      ) a, nodes b WHERE a.node = b.vid
      GROUP BY lim
    ) AS conv_hull
    

    现在与 for 循环的结果相同。但是,我的计算速度并没有显着提高,这是我找到另一个解决方案的重点。可能由于某种原因没有触发并行处理(尽管它是在 PG conf 文件中配置的)...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2018-09-21
      • 2010-11-17
      • 2020-05-27
      • 2014-10-25
      • 1970-01-01
      相关资源
      最近更新 更多