Re: Slow query and indexes... - Mailing list pgsql-general

From PFC
Subject Re: Slow query and indexes...
Date
Msg-id op.trz1uv0acigqcu@apollo13
Whole thread Raw
In response to Re: Slow query and indexes...  ("Jonas Henriksen" <jonas.f.henriksen@gmail.com>)
Responses Re: Slow query and indexes...
List pgsql-general
> Thanks for a good answer, I'll try to find a workaround. The number of
> data_loggers will change, but not to frequently. I was actually hoping
> to make a view showing the latest data for each logger, maybe I can
> manage that with a stored procedure thingy...

    - Create a table which contains your list of loggers (since it's good
normalization anyway, you probably have it already) and have your data
table's logger_id REFERENCE it
    - You now have a simple way to get the list of loggers (just select from
the loggers table which will contain 3 rows)
    - Then, to get the most recent record for each logger_id, you do :

SELECT l.logger_id, (SELECT id FROM data d WHERE d.logger_id = l.logger_id
ORDER BY d.logger_id DESC, d.date_time DESC LIMIT 1) AS last_record_id
 FROM loggers l

    2 minute example :

forum_bench=> CREATE TABLE loggers (id SERIAL PRIMARY KEY, name TEXT );
CREATE TABLE

forum_bench=> INSERT INTO loggers (name) VALUES ('logger 1'),('logger
2'),('logger 3');
INSERT 0 3

forum_bench=> CREATE TABLE data (id SERIAL PRIMARY KEY, logger_id INTEGER
NOT NULL REFERENCES loggers( id ));
CREATE TABLE

forum_bench=> INSERT INTO data (logger_id) SELECT 1+floor(random()*3) FROM
generate_series(1,1000000);

forum_bench=> SELECT logger_id, count(*) FROM data GROUP BY logger_id;
  logger_id | count
-----------+--------
          3 | 333058
          2 | 333278
          1 | 333664


NOTE : I use id rather than timestamp to get the last one

forum_bench=> EXPLAIN ANALYZE SELECT logger_id, max(id) FROM data GROUP BY
logger_id;
                                                      QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
  HashAggregate  (cost=19166.82..19169.32 rows=200 width=8) (actual
time=1642.556..1642.558 rows=3 loops=1)
    ->  Seq Scan on data  (cost=0.00..14411.88 rows=950988 width=8) (actual
time=0.028..503.308 rows=1000000 loops=1)
  Total runtime: 1642.610 ms

forum_bench=> CREATE INDEX data_by_logger ON data (logger_id, id);
CREATE INDEX

forum_bench=> EXPLAIN ANALYZE SELECT l.id, (SELECT d.id FROM data d WHERE
d.logger_id=l.id ORDER BY d.logger_id DESC, d.id DESC LIMIT 1) FROM
loggers l;
                                                                      QUERY
PLAN

-----------------------------------------------------------------------------------------------------------------------------------------------------
  Seq Scan on loggers l  (cost=0.00..3128.51 rows=1160 width=4) (actual
time=0.044..0.074 rows=3 loops=1)
    SubPlan
      ->  Limit  (cost=0.00..2.68 rows=1 width=8) (actual time=0.020..0.020
rows=1 loops=3)
            ->  Index Scan Backward using data_by_logger on data d
(cost=0.00..13391.86 rows=5000 width=8) (actual time=0.018..0.018 rows=1
loops=3)
                  Index Cond: (logger_id = $0)
  Total runtime: 0.113 ms
(6 lignes)

forum_bench=> SELECT l.id, (SELECT d.id FROM data d WHERE d.logger_id=l.id
ORDER BY d.logger_id DESC, d.id DESC LIMIT 1) FROM loggers l;
  id | ?column?
----+----------
   1 |   999999
   2 |  1000000
   3 |   999990
(3 lignes)

pgsql-general by date:

Previous
From: Magnus Hagander
Date:
Subject: Re: tokenize string for tsearch?
Next
From: "Manuel Preliteiro"
Date:
Subject: /var/run/postgresql ??