Hi Tom!

Yep, there are a large number of host_luid/log_luid combinations (there
are approximatly 5-10 hosts and 1-3 logs per system we are running).

Thanks for the recommended workaround, I'll have a try at it at some point
tomorrow.

Regards!
Ed


On Sat, 15 Jan 2005, Tom Lane wrote:

> Edmund Dengler <[EMAIL PROTECTED]> writes:
> >     "record_to_process_idx" unique, btree (host_luid, log_luid, luid) WHERE 
> > (error IS NULL)
>
> > explain analyze
> > select record
> > from agent.record
> > where host_luid = 3::bigint
> >   and log_luid = 2::bigint
> >   and error is null
> > order by host_luid desc, log_luid desc, luid desc
> > limit 1
>
> >  Limit  (cost=0.00..1.47 rows=1 width=286) (actual 
> > time=249064.949..249064.950 rows=1 loops=1)
> >    ->  Index Scan Backward using record_to_process_idx on record  
> > (cost=0.00..13106.73 rows=8898 width=286) (actual 
> > time=249064.944..249064.944 rows=1 loops=1)
> >          Index Cond: ((host_luid = 3::bigint) AND (log_luid = 2::bigint))
> >          Filter: (error IS NULL)
> >  Total runtime: 249065.004 ms
>
> Are there a whole lotta rows with that host_luid/log_luid combination?
>
> What's happening is that the index search initially finds the first such
> row, and then it has to step to the last such row to start the backwards
> scan.  This is fixed as of 8.0, but all earlier releases are going to be
> slow in that scenario.  It's got nothing to do with single vs multi
> column indexes, it is just a shortcoming of the startup code for
> backwards index scans.  (I get the impression that the original
> implementation of Postgres' btree indexes only supported unique indexes,
> because there were a number of places where it was horridly inefficient
> for large numbers of equal keys.  I think this 8.0 fix is the last such
> issue.)
>
> Since your index has an additional column, there is a hack you can use
> to get decent performance in 7.4 and before.  Add a dummy condition on
> the last column:
>       where host_luid = 3::bigint
>         and log_luid = 2::bigint
>         AND LUID <= someverylargevalue::bigint
>         and error is null
>       order by host_luid desc, log_luid desc, luid desc
>       limit 1
> Now, instead of positioning to the first row with value (3,2,anything)
> the initial btree descent will home in on the end of that range, and
> so the expensive stepping over all the rows between is avoided.
>
>                       regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to