map.get_near_link
にマークを付けることを検討してください PARALLEL SAFE
として機能します
。これにより、関数の実行時に並列プランの生成を試みることが許可されていることがデータベースエンジンに通知されます。
クエリプランナーがどのような状況でも並列クエリプランを生成しない原因となる可能性のある設定がいくつかあります。このドキュメントを検討してください:
私の読書では、次のように関数をリファクタリングすると、並列計画を達成できる可能性があります。
CREATE OR REPLACE FUNCTION map.get_near_link(
x NUMERIC,
y NUMERIC,
azim NUMERIC)
RETURNS TABLE
(Link_ID INTEGER, Distance INTEGER, Sendito TEXT, Geom GEOGRAPHY)
AS
$$
SELECT
S.Link_ID,
TRUNC(ST_Distance(ST_GeomFromText('POINT('|| X || ' ' || Y || ')',4326), S.geom) * 100000)::INTEGER AS distance,
S.sentido,
v.geom
FROM (
SELECT *
FROM map.vzla_seg
WHERE ABS(Azim - S.azimuth) NOT BETWEEN 30 AND 330
) S
INNER JOIN map.vzla_rto v
ON S.link_id = v.link_id
WHERE
ST_Distance(ST_GeomFromText('POINT('|| X || ' ' || Y || ')',4326), S.geom) * 100000 < 50
ORDER BY
S.geom <-> ST_GeomFromText('POINT('|| X || ' ' || Y || ')', 4326)
LIMIT 1
$$
LANGUAGE SQL
PARALLEL SAFE -- Include this parameter
;
この関数の実行時にクエリオプティマイザーが並列プランを生成する場合は、独自の並列化ロジックを実装する必要はありません。