decrease my query duration

From: David Carpio <davidc(at)consistentstate(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: decrease my query duration
Date: 2013-07-05 00:26:48
Message-ID: 51D612C8.60301@consistentstate.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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 ) 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

Responses

Browse pgsql-general by date

  From Date Subject
Next Message David Johnston 2013-07-05 00:43:51 Re: How to create a cursor that is independent of transactions and doesn't calculated when created ?
Previous Message David Carpio 2013-07-05 00:04:09 decrease my query duration