2014-03-13 20:26 GMT+01:00 <fburg...@radiantblue.com>:

> PostgreSQL 9.3.3 RHEL 6.4
>
> Total db Server memory 64GB
>
>
> # -----------------------------
> # PostgreSQL configuration file
> # -----------------------------
> max_connections = 100
> shared_buffers = 16GB
> work_mem = 32MB
> maintenance_work_mem = 1GB
> seq_page_cost = 1.0
> random_page_cost = 2.0
> cpu_tuple_cost = 0.03
> #cpu_index_tuple_cost = 0.005
> #cpu_operator_cost = 0.0025
> effective_cache_size = 48MB
> default_statistics_target = 100
> constraint_exclusion = partition
>
> Partition table Setup
> ---------------------
>
> CREATE TABLE measurement (
>     id              bigint not null,
>     city_id         bigint not null,
>     logdate         date not null,
>     peaktemp        bigint,
>     unitsales       bigint,
>     type            bigint,
>     uuid            uuid,
>     geom            geometry
> );
>
>
> CREATE TABLE measurement_y2006m02 (
>     CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' )
> ) INHERITS (measurement);
> CREATE TABLE measurement_y2006m03 (
>     CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' )
> ) INHERITS (measurement);
> ...
> CREATE TABLE measurement_y2007m11 (
>     CHECK ( logdate >= DATE '2007-11-01' AND logdate < DATE '2007-12-01' )
> ) INHERITS (measurement);
> CREATE TABLE measurement_y2007m12 (
>     CHECK ( logdate >= DATE '2007-12-01' AND logdate < DATE '2008-01-01' )
> ) INHERITS (measurement);
> CREATE TABLE measurement_y2008m01 (
>     CHECK ( logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' )
> ) INHERITS (measurement);
>
> Partition measurement_y2007m12 contains 38,261,732 rows
>
> Indexes on partition measurement_y2007m12:
>     "pkey_measurement_y2007m12" PRIMARY KEY, btree (id), tablespace
> "measurement_y2007"
>     "idx_measurement_uuid_y2003m12" btree (uuid), tablespace
> "measurement_y2007"
>     "idx_measurement_type_y2003m12" btree (type), tablespace
> "measurement_y2007"
>     "idx_measurement_city_y2003m12" btree (city_id), tablespace
> "measurement_y2007"
>     "idx_measurement_logdate_y2003m12" btree (logdate), tablespace
> "measurement_y2007"
>     "sidx_measurement_geom_y2003m12" gist (geom), tablespace
> "measurement_y2007"
>
> **** Problem Query *** *
>
> explain (analyze on, buffers on) Select * from measurement this_
>                                   where this_.logdate between '2007-12-19
> 23:38:41.22'::timestamp and '2007-12-20 08:01:04.22'::timestamp
>                                     and this_.city_id=25183 order by
> this_.logdate asc, this_.peaktemp asc, this_.unitsales asc limit 10000;
>
>
> QUERY
> PLAN
>
>
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  Limit  (cost=33849.98..33855.15 rows=2068 width=618) (actual
> time=51710.803..51714.266 rows=10000 loops=1)
>    Buffers: shared hit=25614 read=39417
>    ->  Sort  (cost=33849.98..33855.15 rows=2068 width=618) (actual
> time=51710.799..51712.924 rows=10000 loops=1)
>          Sort Key: this_.logdate, this_.unitsales
>          Sort Method: top-N heapsort  Memory: 15938kB
>          Buffers: shared hit=25614 read=39417
>          ->  Append  (cost=0.00..33736.09 rows=2068 width=618) (actual
> time=50.210..50793.589 rows=312046 loops=1)
>                Buffers: shared hit=25608 read=39417
>                ->  Seq Scan on measurement this_  (cost=0.00..0.00 rows=1
> width=840) (actual time=0.002..0.002 rows=0 loops=1)
>                      Filter: ((logdate >= '2007-12-19
> 23:38:41.22'::timestamp without time zone) AND (logdate <= '2007-12-20
> 08:01:04.22'::timestamp without time zone) AND (city_id = 25183))
>                ->  Index Scan using idx_measurement_city_y2007m12 on
> measurement_y2007m12 this__1  (cost=0.56..33736.09 rows=2067 width=618)
> (actual time=50.206..50731.637 rows=312046 loops=1)
>                      Index Cond: (city_id = 25183)
>                      Filter:  ((logdate >= '2007-12-19
> 23:38:41.22'::timestamp without time zone) AND (logdate <= '2007-12-20
> 08:01:04.22'::timestamp without time zone))
>                      Buffers: shared hit=25608 read=39417
>
>  Total runtime: *51717.639 ms*   <--- *** unacceptable ***
>
> (15 rows)
>
> Total Rows meeting query criteria
> ---------------------------------
>
> Select count(*) from measurement this_ where this_.logdate between
> '2007-12-19 23:38:41.22'::timestamp and '2007-12-20 08:01:04.22'::timestamp
> and this_.city_id=25183;
>
> count
> ------
> 312046
>
> Total Rows in the partition table referenced
> ------------------------------------------
>
> Select count(*) from measurement_y2007m12;
>
>   count
> ---------
> 38261732
>
>
>
>
> *Does anyone know how to speed up this query? I removed the order by
> clause and that significantly reduced the run time to approx. 2000-3000 ms.
> This query is being recorded repeatedly in our logs and executes very
> slowly for our UI users from 12000 ms thru 68000 msAny suggestions would be
> appreciated.*
>

sort (ORDER BY clause) enforce a reading of complete partitions. And it is
slow - it is strange so reading 300K rows needs a 5K sec. Probably your IO
is overloaded.

Regards

Pavel Stehule


>
> thanks
>

Reply via email to