sql >> Database teknologi >  >> RDS >> PostgreSQL

Kan jeg opdele en forespørgsel i flere forespørgsler eller skabe parallelitet for at fremskynde en forespørgsel?

Overvej at markere dit map.get_near_link fungere som PARALLEL SAFE . Dette vil fortælle databasemotoren, at det er tilladt at forsøge at generere en parallel plan, når funktionen udføres:

Der er flere indstillinger, som kan forårsage, at forespørgselsplanlæggeren under ingen omstændigheder genererer en parallel forespørgselsplan. Overvej denne dokumentation:

På min læsning kan du muligvis opnå en parallel plan, hvis du refaktorerer din funktion på denne måde:

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
;

Hvis forespørgselsoptimeringsværktøjet vil generere en parallel plan, når denne funktion udføres, behøver du ikke implementere din egen paralleliseringslogik.



  1. 3 måder at finde rækker, der indeholder små bogstaver i MySQL

  2. Python+MySQLdb underligt problem

  3. Matching af udbud og efterspørgsel — løsninger, del 1

  4. Ved hjælp af Python kan du hurtigt indsætte mange kolonner i Sqlite\Mysql