decrease my query duration

Поиск
Список
Период
Сортировка
От David Carpio
Тема decrease my query duration
Дата
Msg-id 51D60D79.8000608@consistentstate.com
обсуждение исходный текст
Список pgsql-general
Hello All

I am newbie in this forum that's why I will be very grateful if would be able to help me and if you need some additional information please let me know.

I have a query that I would like decrease its duration

SELECT
    s0.SEARCH AS c0,
    s0.id AS c0c1,
    s0.id AS c1,
    s1.name AS c2,
    s1.subtypeid AS c2c1,
    s1a3m1.SEARCH AS c3,
    s1a3m1.id AS c3c1,
    s2.SEARCH AS c4,
    s2.id AS c4c1,
    (
        SELECT
            o.name
        FROM
            my_table_1 fd,
            my_table_2 o
        WHERE
            fd.typeid = o.id
            AND
            fd.id = s2.my_table_1_id
    ) AS c4c2,
    (
        SELECT
            name
        FROM
            my_table_2
        WHERE
            my_table_2.id = s3.id
    ) AS c5,
    s5.SEARCH AS c6,
    s5.id AS c6c1,
    s6.SEARCH AS c7,
    s6.id AS c7c1,
    (
        SELECT
            o.name
        FROM
            my_table_1 fd,
            my_table_2 o
        WHERE
            fd.typeid = o.id
            AND
            fd.id = s6.my_table_1_id
    ) AS c7c2
    FROM
        my_table_3 s0
    JOIN
    (
        SELECT
            o.name AS name,
            c.id,
            c.last_name,
            o.subtypeid AS subtypeid,
            c.spid,
            c.typeid
        FROM
            my_table_4 c,
            my_table_2 o
        WHERE
            c.id = o.id
    ) s1 ON s0.my_table_4_id = s1.id
    AND
    s1.last_name = ''
    JOIN
        my_table_5 s2
        ON
        s1.id = z s2.my_table_2_id
        AND
        s2.my_table_1_id = 0
    LEFT OUTER JOIN
        my_table_6 s3
    LEFT OUTER JOIN
        mY_table_7 s3_a
        ON
        s3.id = s3_a.my_table_6_id
    JOIN
    (
        SELECT
            o.name AS name,
            c.id,
            c.last_name,
            o.subtypeid AS subtypeid,
            c.spid,
            c.typeid
        FROM
            my_table_4 c,
        WHERE
            c.id = o.id
    ) s4
    ON
    s3_a.my_table_7_id = s4.id
    AND
    (
        NOT EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s4.id = ovd.my_table_2_id
        ) OR EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s4.id = ovd.my_table_2_id
                AND
                ''
            BETWEEN
                ovd.startdate AND ovd.enddate
        )
    ) AND s4.last_name = ''
    JOIN
        my_table_3 s5
        ON
        s4.id = s5.my_table_4_id
    JOIN
        my_table_2 f5objects
        ON
        s5.id = f5objects.id
        AND
        f5objects.contentsetid = ''
        AND
    (
        NOT EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s5.id = ovd.my_table_2_id
        ) OR EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s5.id = ovd.my_table_2_id
                AND
                ''
            BETWEEN
                ovd.startdate
                AND
                ovd.enddate
        )
    ) AND
    s5.last_name = ''
    JOIN
        my_table_5 s6
        ON
        s4.id = s6.my_table_2_id
        AND
        s6.my_table_1_id = 0
    JOIN
        my_table_9 ao7
    JOIN
        my_table_5 s7
        ON
        s7.id = ao7.associatedobjectid
        ON
        s4.id = ao7.my_table_2_id
        AND
        s7.my_table_1_id = 0
        AND
    (
        NOT EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s7.id = ovd.my_table_2_id
        ) OR EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s7.id = ovd.my_table_2_id
                AND
                ''
            BETWEEN
                ovd.startdate
                AND
                ovd.enddate
        )
    ) ON
    s1.id = s3.sourceid
    AND
    s3.relationdefinitionid
    IN
    ( ... )
    AND
    (
        NOT EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s3.id = ovd.my_table_2_id
        ) OR EXISTS
        (
            SELECT
                *
            FROM
                my_table_8 ovd
            WHERE
                s3.id = ovd.my_table_2_id
                AND
                ''
            BETWEEN
                ovd.startdate
                AND
                ovd.enddate
        )
    ) LEFT OUTER JOIN
        my_table_10 s1a3m0
        ON
        s1.id = s1a3m0.my_table_4_id
    LEFT OUTER JOIN
        my_table_3 s1a3m1
        ON
        s1a3m0.termid = s1a3m1.id
    WHERE
        s0.last_name = ''
        AND
    (
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
        OR
        s0.id IN ( ... )
    ) AND
    (
        s1a3m0.spid IN
        (
            0,
            0,
            s1.spid
        ) OR
        s1a3m0.spid
        IS NULL
    ) AND NOT EXISTS
    (
        SELECT
            *
        FROM
            my_table_10 fl_exclude
        WHERE
            fl_exclude.my_table_4_id = s1a3m0.my_table_4_id
            AND
            fl_exclude.spid IN
        (
            0,
            0,
            s1.spid
        ) AND CASE
        fl_exclude.spid
        WHEN
            0
        THEN
            0
        WHEN
            0
        THEN
            0
        ELSE
            0
        END > CASE s1a3m0.spid
        WHEN
            0
        THEN
            0
        WHEN
            0
        THEN
            0
        ELSE
            0
        END
    ) ORDER BY
    c1 NULLS FIRST,
    c2 NULLS FIRST,
    c5 NULLS FIRST;

and this is its execution plan

QUERY PLAN                                                            
                                                                                                                                                                       ;                          
Sort  (cost=726512.79..726512.82 rows=11 width=196)
   Sort Key: s0.id, o.name, ((SubPlan 2))
   ->  Nested Loop Anti Join  (cost=595.80..726512.60 rows=11 width=196)
         Join Filter: (fl_exclude.spid = ANY (ARRAY[2407, 4, c.spid]))
   ->  Nested Loop Left Join  (cost=595.80..726079.95 rows=17 width=208)
   ->  Nested Loop Left Join  (cost=595.80..726057.91 rows=17 width=167)
    Filter: ((s1a3m0.spid = ANY ('{2407,4}'::integer[])) OR (s1a3m0.spid = c.spid) OR (s1a3m0.spid IS NULL))
   ->  Nested Loop  (cost=595.80..726040.10 rows=17 width=159)
   ->  Nested Loop Left Join  (cost=595.80..725977.82 rows=17 width=142)
    Join Filter: (c.id = s3.sourceid)
   ->  Nested Loop  (cost=595.80..2357.82 rows=17 width=77)
    Join Filter: (s0.my_table_4_id = c.id)
   ->  Nested Loop  (cost=595.80..2336.88 rows=19 width=69)
   ->  Bitmap Heap Scan on my_table_3 s0  (cost=595.80..1165.50 rows=160 width=49)
    Recheck Cond: ((id = ANY ('{...}'::integer[])) OR (id = ANY ('{...}'::integer[])) OR (id = ANY ('{...}'::integer[])) OR
(id = ANY ('{...}'::integer[])) OR (id = ANY ('{...}'::integer[])) OR (id = ANY ('{...}'::integer[])) OR (id = ANY ('{..}'::integer[])) OR (id = ANY ('{...}'::integer[])))
    Filter: (retired = 0::numeric)
   ->  BitmapOr  (cost=595.80..595.80 rows=182 width=0)
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..81.77 rows=25 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Bitmap Index Scan on my_table_3_pk  (cost=0.00..23.11 rows=7 width=0)
    Index Cond: (id = ANY ('{...}'::integer[]))
   ->  Index Scan using my_table51_idx on my_table_5 s2  (cost=0.00..7.31 rows=1 width=20)
    Index Cond: ((my_table_2_id = s0.my_table_4_id) AND (my_table_1_id = 5435171))
   ->  Index Scan using my_table_4_pk on my_table_4 c  (cost=0.00..1.09 rows=1 width=8)
    Index Cond: (id = s2.my_table_2_id)
    Filter: (retired = 0::numeric)
   ->  Materialize  (cost=0.00..723619.75 rows=1 width=69)
   ->  Nested Loop  (cost=0.00..723619.75 rows=1 width=69)
    Join Filter: (c.id = ao7.my_table_2_id)
   ->  Nested Loop  (cost=0.00..460418.49 rows=18988 width=4)
   ->  Index Scan using my_table52_idx on my_table5 s7  (cost=0.00..324460.90 rows=16361 width=4)
    Index Cond: (my_table_1_id = 10832605)
    Filter: ((NOT (SubPlan 8)) OR (SubPlan 9))
    SubPlan 8
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: (my_table_2_id = s7.id)
    SubPlan 9
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: ((my_table_2_id = s7.id) AND (startdate <= 1294617600000::bigint) AND (enddate >= 1294617600000::bigint))
   ->  Index Scan using my_table_9_idx on my_table_9 ao7  (cost=0.00..8.27 rows=4 width=8)
    Index Cond: (my_table_9_id = s7.id)
   ->  Materialize  (cost=0.00..262631.62 rows=2 width=89)
   ->  Nested Loop  (cost=0.00..262631.61 rows=2 width=89)
   ->  Nested Loop  (cost=0.00..262616.66 rows=1 width=85)
   ->  Nested Loop  (cost=0.00..262602.64 rows=4 width=85)
   ->  Nested Loop  (cost=0.00..260617.71 rows=46 width=36)
   ->  Nested Loop  (cost=0.00..199380.20 rows=3996 width=32)
   ->  Nested Loop  (cost=0.00..150606.82 rows=16820 width=24)
   ->  Index Scan using my_table52_idx on my_table5 s6  (cost=0.00..16383.86 rows=16820 width=20)
    Index Cond: (my_table_1_id = 10868152)
   ->  Index Only Scan using my_table_2_pk on my_table_2 o  (cost=0.00..7.97 rows=1 width=4)
    Index Cond: (id = s6.my_table_2_id)
   ->  Index Scan using my_table_7_idx on my_table_7 s3_a  (cost=0.00..2.81 rows=9 width=8)
    Index Cond: (targetid = o.id)
   ->  Index Scan using my_table_6_pk on my_table_6 s3  (cost=0.00..15.31 rows=1 width=8)
    Index Cond: (id = s3_a.my_table_6_id)
    Filter: ((relationdefinitionid = ANY ('{16018218,16018217,16018219,16018216}'::integer[])) AND ((NOT (SubPlan 10)) OR (SubPlan 11)))
    SubPlan 10
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: (my_table_2_id = s3.id)
    SubPlan 11
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: ((my_table_2_id = s3.id) AND (startdate <= 1294617600000::bigint) AND (enddate >= 1294617600000::bigint))
   ->  Index Scan using my_table_3_idx on my_table_3 s5  (cost=0.00..43.13 rows=2 width=49)
    Index Cond: (my_table_4_id = o.id)
    Filter: ((retired = 0::numeric) AND ((NOT (SubPlan 6)) OR (SubPlan 7)))
    SubPlan 6
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: (my_table_2_id = s5.id)
    SubPlan 7
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: ((my_table_2_id = s5.id) AND (startdate <= 1294617600000::bigint) AND (enddate >= 1294617600000::bigint))
   ->  Index Scan using my_table_2_pk on my_table_2 f5objects  (cost=0.00..3.50 rows=1 width=4)
    Index Cond: (id = s5.id)
    Filter: (contentsetid = 10821468)
   ->  Index Scan using my_table_4_pk on my_table_4 c  (cost=0.00..14.94 rows=1 width=4)
    Index Cond: (id = o.id)
    Filter: ((retired = 0::numeric) AND ((NOT (SubPlan 4)) OR (SubPlan 5)))
    SubPlan 4
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: (my_table_2_id = c.id)
    SubPlan 5
   ->  Index Only Scan using my_table_81_idx on my_table8 ovd  (cost=0.00..6.96 rows=1 width=0)
    Index Cond: ((my_table_2_id = c.id) AND (startdate <= 1294617600000::bigint) AND (enddate >= 1294617600000::bigint))
   ->  Index Scan using my_table_2_pk on my_table_2 o  (cost=0.00..3.65 rows=1 width=29)
    Index Cond: (id = c.id)
   ->  Index Scan using my_table_10_pk on my_table_10 s1a3m0  (cost=0.00..1.03 rows=1 width=12)
    Index Cond: (c.id = my_table_4_id)
   ->  Index Scan using my_table_3_pk on my_table_3 s1a3m1  (cost=0.00..1.29 rows=1 width=45)
    Index Cond: (s1a3m0.my_table_3_id = id)
   ->  Index Only Scan using my_table_10_pk on my_table_10 fl_exclude  (cost=0.00..1.04 rows=1 width=8)
    Index Cond: (my_table_4_id = s1a3m0.my_table_4_id)
    Filter: (CASE spid WHEN 2407 THEN 2 WHEN 4 THEN 1 ELSE 0 END > CASE s1a3m0.spid WHEN 2407 THEN 2 WHEN 4 THEN 1 ELSE 0 END)
    SubPlan 1
   ->  Nested Loop  (cost=0.00..14.66 rows=1 width=23)
   ->  Index Scan using my_table_1_pk on my_table_1 fd  (cost=0.00..6.27 rows=1 width=4)
    Index Cond: (id = s2.my_table_1_id)
   ->  Index Scan using my_table_2_pk on my_table_2 o  (cost=0.00..8.38 rows=1 width=27)
    Index Cond: (id = fd.typeid)
    SubPlan 2
   ->  Index Scan using my_table_2_pk on my_table_2 o  (cost=0.00..8.38 rows=1 width=23)
    Index Cond: (id = s3.id)
    SubPlan 3
   ->  Nested Loop  (cost=0.00..14.66 rows=1 width=23)
   ->  Index Scan using my_table_1_pk on my_table_1 fd  (cost=0.00..6.27 rows=1 width=4)
    Index Cond: (id = s6.my_table_1_id)
   ->  Index Scan using my_table_2_pk on my_table_2 o  (cost=0.00..8.38 rows=1 width=27)
    Index Cond: (id = fd.typeid)
(120 rows)

Is there another way to do this query faster?

Thank you for the tips,

David Carpio

В списке pgsql-general по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: decrease my query duration
Следующее
От: Jayadevan M
Дата:
Сообщение: query on query