我在腳本中使用 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 $$;
uj5u.com熱心網友回復:
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,對于初學者。閱讀手冊章節“并行查詢”中的詳細資訊。
uj5u.com熱心網友回復:
好的,謝謝!我得到了它的完整宣告:
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 檔案中配置的)...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340197.html
標籤:sql PostgreSQL
