sql >> Database >  >> RDS >> PostgreSQL

Kan ik een query splitsen in meerdere query's of parallellisme creëren om een ​​query te versnellen?

Overweeg om uw map.get_near_link . te markeren functioneren als PARALLEL SAFE . Dit zal de database-engine vertellen dat het is toegestaan ​​om een ​​parallel plan te genereren bij het uitvoeren van de functie:

Er zijn verschillende instellingen die ervoor kunnen zorgen dat de queryplanner in geen geval een parallel queryplan genereert. Overweeg deze documentatie:

Als ik het zo lees, kun je misschien een parallel plan bereiken als je je functie als volgt refactoreert:

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
;

Als de query-optimizer een parallel plan genereert bij het uitvoeren van deze functie, hoeft u uw eigen parallellisatielogica niet te implementeren.



  1. Hoe een verouderde Oracle Data Provider verwijderen?

  2. PHP negeert SSL-certificaten bij verbinding met MySql

  3. Opgeslagen Oracle-procedure aanroepen met Entity Framework met uitvoerparameter?

  4. Symfony2.3 onbewerkte sql-query met IN-clausule