Jason Long wrote:
> I would greatly appreciate any advice on how to read the following 
> output from EXPLAIN ANALYZE.
> 
> When running the query the first time from a fresh restore it takes 
> about 55 sec.
> On a second run is take about 2 sec.
> After the vacuum it takes about 36 sec no matter how many 
> times I run it.



> *Query run from a fresh restore*

> "Sort  (cost=242145.26..242145.27 rows=1 width=1200) (actual 
> time=55100.785..55100.820 rows=158 loops=1)"
...
> "Total runtime: 55101.547 ms"

What is shown is the query plan that the planner chose as having the cheapest 
estimated cost.
The cost of the various components of the query plan are shown. The units are 
not time, but estimations of relative cost.
The estimated number of rows that will be returned by each component are also 
shown.
The actual milliseconds it took and rows returned are also shown. If a 
component is looped through, the time is the average per loop.
The second values for cost and time are the cost or time to complete.

Documentation:
http://www.postgresql.org/docs/8.3/interactive/using-explain.html

I can't explain why you get negative actual times.


> *Before vacuum but after a second run of the query*

> "Sort  (cost=241636.97..241637.00 rows=10 width=183) (actual 
> time=2182.240..2182.273 rows=158 loops=1)"
...
> "Total runtime: 2183.176 ms"

Just looking at the first line shows that this second query has chosen a 
different plan that the one above.


> *After vacuum -- I see no improvement even after several runs*

> "Sort  (cost=243084.23..243084.24 rows=5 width=107) (actual 
> time=36649.839..36649.876 rows=158 loops=1)"
...
> "Total runtime: 36650.609 ms"

This is obviously a third query plan.

i.e. All three of the queries shown are using different plans, so what you are 
looking for is why different plans are chosen, rather than why a single plan 
sometimes runs fast, and sometimes runs slow.

When there are large differences in times that queries take, it is often due to 
gross under-estimation of the number of rows that a portion of the plan will 
return, resulting in many loops through a portion of the query that the planner 
thought it would only go through a small number of times.

The join of popipe1_1_.id = popipe1_.id shows an example of this, in your first 
query it is the last 5 lines, which it is expecting to loop through once, which 
we can tell due to the line indented to the same amount much higher up (with 
estimated cost 240701.08).
That join has moved in the second query, and is under a Materialize line. The 
chosen plan is different, and that portion is only performed once. The 
Materialize part was expected to be looped through 12 times, but it went 
through 3174 times.
In the third plan, it isn't under a Materialize, and is expected to loop 6 
times. It loops 3174 times.

Hopefully others can provide more help, I've gotta go...

Regards,
Stephen Denne.
--
At the Datamail Group we value teamwork, respect, achievement, client focus, 
and courage. 
This email with any attachments is confidential and may be subject to legal 
privilege.  
If it is not intended for you please advise by replying immediately, destroy it 
and do not 
copy, disclose or use it in any way.

The Datamail Group, through our GoGreen programme, is committed to 
environmental sustainability.  
Help us in our efforts by not printing this email.
__________________________________________________________________
  This email has been scanned by the DMZGlobal Business Quality
              Electronic Messaging Suite.
Please see http://www.dmzglobal.com/dmzmessaging.htm for details.
__________________________________________________________________



-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to