Re: How to optimize monstrous query, sorts instead of using index - Mailing list pgsql-performance

From Michael Mattox
Subject Re: How to optimize monstrous query, sorts instead of using index
Date
Msg-id CJEBLDCHAADCLAGIGCOOOEKHCKAA.michael.mattox@verideon.com
Whole thread Raw
In response to Re: How to optimize monstrous query, sorts instead of using index  (SZUCS Gábor <surrano@mailbox.hu>)
Responses Re: How to optimize monstrous query, sorts instead of using index  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-performance
> Finally, decided to do an ad-hoc adjustment. Try this, or (wild guess) try
> to completely eliminate the WHERE part by subselects on ms and monitorx.
>
> This may be faster, slower, or even give different results, based
> on whether
> I guessed the 1:N relationships right or not.

It's much slower but I appreciate you taking the time to try.  I'm pretty
new to SQL so I must admin this query is very confusing for me.  I'm using
Java Data Objects (JDO, an O/R mapping framework) but the implementation I'm
using (Kodo) isn't smart enough to do all the joins efficiently, which is
why I had to rewrite this query by hand.

Here's the output:

veriguard=# explain select ms.averageconnecttimex as ms_averageconnecttime,
ms.averagedurationx as ms_averageduration, ms.datex as ms_date, ms.idx as
ms_id, ms.statusstringx as ms_statusstring, ms.statusx as ms_status,
msi.actualcontentx as msi_actualcontent, msi.connecttimex as
msi_connecttime, msi.correctcontentx as msi_correctcontent, msi.datex as
msi_date, msi.descriptionx as msi_description, msi.durationx as
msi_duration, msi.errorcontentx as msi_errorcontent, msi.idx as msi_id,
msi.monitorlocationx as msi_monitorlocation, msi.statusstringx as
msi_statusstring, msi.statusx as msi_status from monitorstatusx ms LEFT JOIN
monitorx ON (monitorx.jdoidx = ms.monitorx) LEFT JOIN
monitorstatus_statusitemsx ms_si ON (ms.jdoidx = ms_si.jdoidx) LEFT JOIN
monitorstatusitemlistd8ea58a5x msil ON (ms_si.statusitemsx = msil.jdoidx)
LEFT JOIN monitorstatusitemx msi ON (msil.statusitemlistx = msi.jdoidx)
where     monitorx.idx = 'M-TEST_1444-TEST_00_10560561260561463219352' AND
ms.datex >= '2003-06-20 08:57:21.36' AND ms.datex <= '2003-06-29
08:57:21.36';

QUERY PLAN
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-------------------------------------
 Merge Join  (cost=1006209.47..1283529.68 rows=751715 width=826)
   Merge Cond: ("outer".jdoidx = "inner".statusitemlistx)
   ->  Index Scan using monitorstatusitemx_pkey on monitorstatusitemx msi
(cost=0.00..247679.64 rows=6595427 width=665)
   ->  Sort  (cost=1006209.47..1008088.76 rows=751715 width=161)
         Sort Key: msil.statusitemlistx
         ->  Merge Join  (cost=697910.17..864079.59 rows=751715 width=161)
               Merge Cond: ("outer".jdoidx = "inner".statusitemsx)
               ->  Index Scan using monitorstatusitejdoid7db0befci on
monitorstatusitemlistd8ea58a5x msil  (cost=0.00..136564.80 rows=6595427
width=16)
               ->  Sort  (cost=697910.17..699789.46 rows=751715 width=145)
                     Sort Key: ms_si.statusitemsx
                     ->  Merge Join  (cost=385727.49..561594.96 rows=751715
width=145)
                           Merge Cond: ("outer".jdoidx = "inner".jdoidx)
                           ->  Index Scan using
monitorstatus_stjdoidb742c9b3i on monitorstatus_statusitemsx ms_si
(cost=0.00..146268.80 rows=6595427 width=16)
                           ->  Sort  (cost=385727.49..387606.78 rows=751715
width=129)
                                 Sort Key: ms.jdoidx
                                 ->  Hash Join  (cost=155.66..255240.65
rows=751715 width=129)
                                       Hash Cond: ("outer".monitorx =
"inner".jdoidx)
                                       Filter: ("inner".idx =
'M-TEST_1444-TEST_00_10560561260561463219352'::character varying)
                                       ->  Seq Scan on monitorstatusx ms
(cost=0.00..240050.69 rows=751715 width=83)
                                             Filter: ((datex >= '2003-06-20
08:57:21.36'::timestamp without time zone) AND (datex <= '2003-06-29
08:57:21.36'::timestamp without time zone))
                                       ->  Hash  (cost=151.93..151.93
rows=1493 width=46)
                                             ->  Seq Scan on monitorx
(cost=0.00..151.93 rows=1493 width=46)
(22 rows)

veriguard=#




pgsql-performance by date:

Previous
From: SZUCS Gábor
Date:
Subject: Re: How to optimize monstrous query, sorts instead of
Next
From: "Michael Mattox"
Date:
Subject: Re: How to optimize monstrous query, sorts instead of