Thread: index and min()

index and min()

From
sarek@ozaba.cx
Date:
Hello,

I have a table that contains logs from a radius accounting server.
Currently the table contains 1,780,470 rows and is about 350Mb on the disk.

It is running on a mssql server at the moment but I would like to move it 
over to a postgresql server and postgresql seems to be somewhat fast than 
mssql on most things except one.

SELECT min(inserttime) FROM acc_pb; which takes about 11 seconds to 
complete.

On the mssql server this takes less than 1 second.

On the mssql server the inserttime column has a cluster index which if I 
understand correctly means that the index is ordered which would explain why 
the min() and max() functions are fast.

Is there an ordered index on postgresql or is the problem something else?

I have a b-tree index on the inserttime column in postgresql but it isn't 
used somehow.

test=# EXPLAIN ANALYZE SELECT min(inserttime) from accounting;
QUERYPLAN                                                        
 
---------------------------------------------------------------------------- 
Aggregate  (cost=55162.88..55162.88 rows=1 width=8)          (actual time=11798.27..11798.27 rows=1 loops=1)     ->
SeqScan on accounting  (cost=0.00..50711.70 rows=1780470 width=8)                           (actual time=0.14..8703.67
rows=1780470loops=1)
 
Total runtime: 11798.39 msec
(3 rows)

Time: 11799.69 ms

Any help is greatly appreciated.

Best Regards
Magnus


Re: index and min()

From
Christopher Browne
Date:
In an attempt to throw the authorities off his trail, sarek@ozaba.cx transmitted:
> SELECT min(inserttime) FROM acc_pb; which takes about 11 seconds to
> complete.
>
> On the mssql server this takes less than 1 second.

If you have NO index on inserttime, then the best that can be done is
the sequential scan that you saw.

If there is an index on inserttime, then the PostgreSQL idiom that
provides a _massive_ speedup is the query:
select inserttime from acc_pb order by inserttime limit 1;

In theory, it ought to be a nifty idea to have a way of automatically
transforming the min(inserttime) query into what I showed, but that is
likely to be difficult to do in general, and nobody has yet proposed
an implementation, so you'll have to do that yourself.
-- 
let name="cbbrowne" and tld="acm.org" in String.concat "@" [name;tld];;
http://www3.sympatico.ca/cbbrowne/x.html
"Linux  and  other  OSS  advocates  are making  a  progressively  more
credible argument  that OSS software is  at least as robust  -- if not
more  -- than  commercial  alternatives." -  Microsoft lamenting  Open
Source Software in the "Halloween Document"