2017-05-12 5 views
0

Ich brauche wirklich einen Rat. Ich versuche, um die Funktion zu verwenden: pivot_subrecords_set_table_1Optimierung der Leistung der pgSQL-Funktion

In der folgenden Abfrage:

CREATE OR REPLACE FUNCTION public.pivot_subrecords_set_table_1(id bigint, 
    OUT idx bigint, OUT upn_1 text, OUT status_1 text, OUT upn_2 text, OUT 
    status_2 text, OUT upn_3 text, OUT status_3 text, OUT upn_4 text, OUT 
    status_4 text, OUT upn_5 text, OUT status_5 text, OUT upn_6 text, OUT 
    status_6 text, OUT upn_7 text, OUT status_7 text, OUT upn_8 text, OUT 
    status_8 text, OUT upn_9 text, OUT status_9 text, OUT upn_10 text, OUT 
    status_10 text) 
    RETURNS SETOF record 
    LANGUAGE plpgsql 
    AS $function$ 

    DECLARE 
    key ALIAS FOR $1; 
    BEGIN 
    RETURN QUERY 
    WITH sub_upn AS (SELECT * FROM crosstab 
    ('SELECT id, mx_osobastatus, mx_osobaupn FROM mt_epizod_subrecord 
    WHERE mt_epizod_subrecord.mx_syscategory = ''tableepizodinfo'' 
    AND mt_epizod_subrecord.id = '|| key ||' GROUP BY id, mx_osobaupn, 
    mx_osobastatus 
    ORDER BY id') AS ct 
    (id bigint, UPN_1 text, UPN_2 text, UPN_3 text, UPN_4 text, UPN_5 text, UPN_6 
    text, UPN_7 text, UPN_8 text ,UPN_9 text, UPN_10 text) 
    ), 
    sub_stat AS 
    (SELECT * FROM crosstab 
    ('SELECT id, mx_osobaupn, mx_osobastatus FROM mt_epizod_subrecord 
    WHERE mt_epizod_subrecord.mx_syscategory = ''tableepizodinfo'' 
    AND mt_epizod_subrecord.id = '|| key ||' GROUP BY 1,2,3 ORDER BY id ') 
    AS cn (id bigint, status_1 text, status_2 text, status_3 text, status_4 text, 
    status_5 text, status_6 text, status_7 text, status_8 text, 
    status_9 text, status_10 text) 
    ) 
    SELECT 
    supn.id, 
    supn.UPN_1, 
    sust.status_1, 
    supn.UPN_2, 
    sust.status_2, 
    supn.UPN_3, 
    sust.status_3, 
    supn.UPN_4, 
    sust.status_4, 
    supn.UPN_5, 
    sust.status_5, 
    supn.UPN_6, 
    sust.status_6, 
    supn.UPN_7, 
    sust.status_7, 
    supn.UPN_8, 
    sust.status_8, 
    supn.UPN_9, 
    sust.status_9, 
    supn.UPN_10, 
    sust.status_10 
    FROM sub_upn supn 
    JOIN sub_stat sust ON supn.id = sust.id; 
    END; 
    $function$ 

Aber die Leistung der Funktion ist sehr gering:

SELECT rec.id AS key, 
    rec.primaryurn AS urn, 
    rec.mx_syscreatedby AS creared_by, 
    (SELECT mf_mxdate_str_to_date (epi.mx_epizoddate)) AS date_of_creation, 
    epi.mx_epizodenotes AS notes, 
    epi.mx_effectscountry AS country, 
    epi.mx_effectsregion AS region, 
    epi.mx_effectscity AS city, 
    (SELECT get_epizod_subrecords (epi.id)) AS epizod_type 
    (pivot_subrecords_set_table_1 (epi.id)).idx, 
    (pivot_subrecords_set_table_1 (epi.id)).upn_1 AS upn_1, 
    (pivot_subrecords_set_table_1 (epi.id)).status_1 
    FROM mxt_recordheader AS rec, mt_epizod AS epi, mt_epizod_subrecord AS eps 
    WHERE rec.entitytype = 'epizod' 
    AND rec.logicalserverprefix = 'EA' 
    AND epi.id = rec.id; 

Die Funktion sieht wie folgt aus. Wie kann ich die Leistung einer Funktion erhöhen oder kann ich die Abfrage, in der sie verwendet wird, neu schreiben?

+0

Danke Laurenz. Ich werde deinen Rat annehmen. –

Antwort

0

Verwenden Sie plprofiler, um herauszufinden, was in Ihrer Funktion langsam ist und optimieren Sie das.