【发布时间】:2021-04-01 09:57:51
【问题描述】:
我有一个表(嗯,它是 CTE),其中包含路径、节点 ID 数组和具有几何形状的节点表。我正在尝试使用它们的开始和结束节点以及几何图形来选择路径,如下所示:
SELECT *
FROM (
SELECT t.path_id, t.segment_num, t.start_node, t.end_node, ST_MakeLine(n.geom) AS geom
FROM (SELECT path_id, segment_num, nodes[1] AS start_node, nodes[array_upper(nodes,1)] AS end_node, unnest(nodes) AS node_id
FROM paths
) t
JOIN nodes n ON n.id = t.node_id
GROUP BY path_id, segment_num, start_node, end_node
) rs
当我在单个路径样本上尝试它时,这似乎工作得很好,但是当我在大型数据集上运行它时,少量生成的几何图形很糟糕 - 显然ST_MakeLine 接收到的点顺序错误。我怀疑并行聚合会导致错误的顺序,但也许我在这里遗漏了其他东西?
如何确保ST_MakeLine 中的点顺序正确?
如果我对并行聚合的看法是正确的,postgres docs 说的是 Scans of common table expressions (CTEs) are always parallel restricted,但这是否意味着我必须使用未嵌套的数组制作 CTE 并将其标记为 AS MATERIALIZED,因此它不会被优化回查询?
【问题讨论】:
-
ST_MakeLine(n.geom ORDER BY ...)你需要t中的排序列。segment_num大概?
标签: sql postgresql postgis