Search Postgresql Archives

Slow query and indexes...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I'm trying to figure out how to make postgres utilize my indexes on a table.
this query:
explain analyze SELECT max(date_time) FROM data_values;
Goes fast and returns:

                                                QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result  (cost=0.08..0.09 rows=1 width=0) (actual time=0.108..0.111
rows=1 loops=1)
  InitPlan
    ->  Limit  (cost=0.00..0.08 rows=1 width=8) (actual
time=0.090..0.092 rows=1 loops=1)
          ->  Index Scan Backward using
data_values_data_date_time_index on data_values  (cost=0.00..58113.06
rows=765121 width=8) (actual time=0.078..0.078 rows=1 loops=1)
                Filter: (date_time IS NOT NULL)
Total runtime: 0.204 ms
(6 rows)

while if I add a GROUP BY data_logger  the query uses a seq scan and a
lot of time:
explain analyze SELECT max(date_time) FROM data_values GROUP BY
data_logger_id;

                                               QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
HashAggregate  (cost=20171.82..20171.85 rows=3 width=12) (actual
time=3510.500..3510.506 rows=3 loops=1)
  ->  Seq Scan on data_values  (cost=0.00..16346.21 rows=765121
width=12) (actual time=0.039..1598.518 rows=765121 loops=1)
Total runtime: 3510.634 ms
(3 rows)

Tha table contains approx 765000 rows. It has three distinct
data_logger_id's. I can make quick queries on each of them using:
SELECT max(date_time) FROM data_values where data_logger_id=1

I have an index on the date_time field and on the data_logger_id
field, and I ahve also tried to make an index with both date_time and
data_logger_id. Anyone have any idea whats going on, and suggestions
what I should do to speed up my query?


Regards Jonas:)))

Im using PostgreSQL 8.2.3 on windows xp.

My table:
CREATE TABLE data_values
(
 data_value_id serial NOT NULL,
 data_type_id integer NOT NULL,
 data_collection_id integer NOT NULL,
 data_logger_id integer NOT NULL,
 date_time timestamp without time zone NOT NULL,
 lat_wgs84 double precision NOT NULL,
 lon_wgs84 double precision NOT NULL,
 height integer NOT NULL,
 parallell integer NOT NULL DEFAULT 0,
 data_value double precision NOT NULL,
 sensor_id integer,
 CONSTRAINT data_values_pkey PRIMARY KEY (data_value_id),
 CONSTRAINT data_values_data_collection_id_fkey FOREIGN KEY
(data_collection_id)
     REFERENCES data_collections (data_collection_id) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT data_values_data_logger_id_fkey FOREIGN KEY (data_logger_id)
     REFERENCES data_loggers (data_logger_id) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT data_values_data_type_id_fkey FOREIGN KEY (data_type_id)
     REFERENCES data_types (data_type_id) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT data_values_sensor_id_fkey FOREIGN KEY (sensor_id)
     REFERENCES sensors (sensor_id) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT data_values_data_type_id_key UNIQUE (data_type_id,
data_logger_id, date_time, lat_wgs84, lon_wgs84, height, parallell)
);

CREATE INDEX data_values_data_date_time_index
 ON data_values
 USING btree
 (date_time);

CREATE INDEX data_values_data_logger_id_index
 ON data_values
 USING btree
 (data_logger_id);

CREATE INDEX data_values_time_logger_index
 ON data_values
 USING btree
 (data_logger_id, date_time);


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux