Skip site navigation (1) Skip section navigation (2)

Poor query performance

From: Alex <alex(at)liivid(dot)com>
To: pgsql-performance(at)postgresql(dot)org
Subject: Poor query performance
Date: 2009-07-09 21:34:01
Message-ID: 7345caea-3915-449a-927b-00db408550bd@x5g2000prf.googlegroups.com (view raw or flat)
Thread:
Lists: pgsql-performance
Below is a query that takes 16 seconds on the first run.  I am having
generally poor performance for queries in uncached areas of the data
and often mediocre (500ms-2s+) performance generallly, although
sometimes it's very fast.  All the queries are pretty similar and use
the indexes this way.

I've been trying to tune this thing with little luck.  There are about
1.5M records.  It's using the index properly.  Settings are:
work_mem=20MB, shared_buffers=128MB, effective_cache_size=1024MB.

I have run ANALYZE and VACUUM FULL recently.

The whole database is around 16GB.   The server is an ec2 instance
with 5 compute units in two cores (1 unit is one 2Ghz processor) and
1.7Gb of RAM.

Swapping seems to be minimal.

Note that the ANALYZE is from my slow query logger, so the numbers
don't match the time the uncached query took.

There are 118K rows in this select.  It is possible the sort is the
issue, but that's why I have 20M working memory.  Do I really need
more than that?

Slow query: (16.852746963501) [0] SELECT id FROM "source_listings"
WHERE (post_time BETWEEN '2009-07-02 14:19:29.520886' AND '2009-07-11
14:19:29.520930' AND ((geo_lon BETWEEN 10879358 AND 10909241 AND
geo_lat BETWEEN 13229080 AND 13242719)) AND city = 'boston')  ORDER BY
post_time DESC LIMIT 108 OFFSET 0
Limit  (cost=30396.63..30396.90 rows=108 width=12) (actual
time=1044.575..1044.764 rows=108 loops=1)
  ->  Sort  (cost=30396.63..30401.47 rows=1939 width=12) (actual
time=1044.573..1044.630 rows=108 loops=1)
        Sort Key: post_time
        Sort Method:  top-N heapsort  Memory: 21kB
        ->  Bitmap Heap Scan on source_listings
(cost=23080.81..30321.44 rows=1939 width=12) (actual
time=321.111..952.704 rows=118212 loops=1)
              Recheck Cond: ((city = 'boston'::text) AND (post_time >=
'2009-07-02 14:19:29.520886'::timestamp without time zone) AND
(post_time <= '2009-07-11 14:19:29.52093'::timestamp without time
zone) AND (geo_lat >= 13229080) AND (geo_lat <= 13242719) AND (geo_lon
>= 10879358) AND (geo_lon <= 10909241))
              ->  Bitmap Index Scan on sl_city_etc
(cost=0.00..23080.33 rows=1939 width=0) (actual time=309.007..309.007
rows=118212 loops=1)
                    Index Cond: ((city = 'boston'::text) AND
(post_time >= '2009-07-02 14:19:29.520886'::timestamp without time
zone) AND (post_time <= '2009-07-11 14:19:29.52093'::timestamp without
time zone) AND (geo_lat >= 13229080) AND (geo_lat <= 13242719) AND
(geo_lon >= 10879358) AND (geo_lon <= 10909241))
Total runtime: 1045.683 ms



Even without the sort performance is poor:

cribq=# EXPLAIN ANALYZE SELECT count(id) FROM "source_listings" WHERE
(post_time BETWEEN '2009-07-02 14:19:29.520886' AND '2009-07-11
14:19:29.520930' AND ((geo_lon BETWEEN 10879358 AND 10909241 AND
geo_lat BETWEEN 13229080 AND 13242719)) AND city = 'boston');
 
QUERY
PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=30326.29..30326.30 rows=1 width=4) (actual
time=847.967..847.968 rows=1 loops=1)
   ->  Bitmap Heap Scan on source_listings  (cost=23080.81..30321.44
rows=1939 width=4) (actual time=219.505..769.878 rows=118212 loops=1)
         Recheck Cond: ((city = 'boston'::text) AND (post_time >=
'2009-07-02 14:19:29.520886'::timestamp without time zone) AND
(post_time <= '2009-07-11 14:19:29.52093'::timestamp without time
zone) AND (geo_lat >= 13229080) AND (geo_lat <= 13242719) AND (geo_lon
>= 10879358) AND (geo_lon <= 10909241))
         ->  Bitmap Index Scan on sl_city_etc  (cost=0.00..23080.33
rows=1939 width=0) (actual time=206.981..206.981 rows=118212 loops=1)
               Index Cond: ((city = 'boston'::text) AND (post_time >=
'2009-07-02 14:19:29.520886'::timestamp without time zone) AND
(post_time <= '2009-07-11 14:19:29.52093'::timestamp without time
zone) AND (geo_lat >= 13229080) AND (geo_lat <= 13242719) AND (geo_lon
>= 10879358) AND (geo_lon <= 10909241))
 Total runtime: 848.816 ms

Responses

pgsql-performance by date

Next:From: AlexDate: 2009-07-09 21:35:31
Subject: Re: Poor query performance
Previous:From: Grzegorz JaƛkiewiczDate: 2009-07-09 20:25:21
Subject: Re: Sorting by an arbitrary criterion

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group