sql >> データベース >  >> RDS >> PostgreSQL

クエリを複数のクエリに分割したり、並列処理を作成してクエリを高速化することはできますか?

    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
    ;
    

    この関数の実行時にクエリオプティマイザーが並列プランを生成する場合は、独自の並列化ロジックを実装する必要はありません。



    1. DBアプリケーションの監査証跡/変更履歴を残すための効果的な戦略?

    2. Doctrine query postgres json(含む)json_array

    3. Mysqlクエリ:値を1つ減らします

    4. PDO MySQL:1つのクエリに複数の行を挿入します