Re: Slow indexscan

From: "Mikko Partio" <mpartio(at)gmail(dot)com>
To: "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Slow indexscan
Date: 2007-06-20 15:55:56
Message-ID: 2ca799770706200855w1a6b6a7cy8526b9be0ef9c97c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

On 6/20/07, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
>
> "Mikko Partio" <mpartio(at)gmail(dot)com> writes:
>
> > Index Scan using tbl_20070601_pkey on tbl_20070601 t1
> > (cost=0.00..365.13rows=13 width=137) (actual time=
> > 120.83..10752.64 rows=539 loops=1)
> > Index Cond: ((validtime >= 20070602000000::bigint) AND (validtime <=
> > 20070602235500::bigint) AND (latitude = 60.2744::double precision) AND
> > (longitude = 26.4417::double precision))
> > Filter: (parname = 'temperature'::character varying)
>
> You do realize that's going to scan the entire index range from
> 20070602000000 to 20070602235500?
>
> If this is a typical query you'd be better off putting the lat/long
> columns first in the index.
>
> regards, tom lane

Thanks for the reply.

Adding a new index does not speed up the query (although the planner decides
to use the index):

db=# create index tbl_20070601_latlonvalidpar_index on tbl_20070601
(latitude,longitude,validtime,parname);
CREATE INDEX

db=# explain analyze select * from tbl_20070601 where validtime between
20070602000000 and 20070602235500 and latitude=60.2744 and
longitude=26.4417and parname in ('temperature');

QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using tbl_20070601_latlonvalidpar_index on tbl_20070601 t1
(cost=0.00..29.18 rows=13 width=137) (actual time=3471.94..31542.90 rows=539
loops=1)
Index Cond: ((latitude = 60.2744::double precision) AND (longitude =
26.4417::double precision) AND (validtime >= 20070602000000::bigint) AND
(validtime <= 20070602235500::bigint) AND (parname =
'temperature'::character varying))
Total runtime: 31544.48 msec
(3 rows)

This is a very typical query and therefore it should be made as fast as
possible. There are several tables like this rowcount ranging from 3 million
to 13 million. I have some possibilities to modify the queries as well as
the tables, but the actual table structure is hard coded.

Any other suggestions?

Regards

MP

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Tom Lane 2007-06-20 16:01:16 Re: Slow indexscan
Previous Message RESTOUX 2007-06-20 15:27:52 Re: [PG 8.1.0 / AIX 5.3] Vacuum processes freezing