seqscan strikes again

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

 



I'm wondering if there's any way I can tweak things so that the estimate
for the query is more accurate (I have run analyze):

                                                                                  QUERY PLAN                                                                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=2712755.92..2713043.69 rows=12790 width=24)
   ->  Nested Loop  (cost=2997.45..2462374.58 rows=9104776 width=24)
         Join Filter: (("outer".prev_end_time < ms_t("inner".tick)) AND ("outer".end_time >= ms_t("inner".tick)))
         ->  Seq Scan on bucket b  (cost=0.00..51.98 rows=1279 width=20)
               Filter: ((rrd_id = 1) AND (end_time <= '2004-11-09 16:04:00-06'::timestamp with time zone) AND (end_time > '2004-11-08 16:31:00-06'::timestamp with time zone))
         ->  Materialize  (cost=2997.45..3638.40 rows=64095 width=28)
               ->  Hash Join  (cost=94.31..2997.45 rows=64095 width=28)
                     Hash Cond: ("outer".alert_def_id = "inner".id)
                     ->  Seq Scan on alert  (cost=0.00..1781.68 rows=64068 width=28)
                     ->  Hash  (cost=88.21..88.21 rows=2440 width=8)
                           ->  Hash Join  (cost=1.12..88.21 rows=2440 width=8)
                                 Hash Cond: ("outer".alert_type_id = "inner".id)
                                 ->  Seq Scan on alert_def d  (cost=0.00..44.39 rows=2439 width=8)
                                 ->  Hash  (cost=1.10..1.10 rows=10 width=4)
                                       ->  Seq Scan on alert_type t  (cost=0.00..1.10 rows=10 width=4)
(15 rows)

opensims=# set enable_seqscan=false;
SET
opensims=# explain analyze SELECT a.rrd_bucket_id, alert_type_id
opensims-#                                         , count(*), count(*), count(*), min(ci), max(ci), sum(ci), min(rm), max(rm), sum(rm)
opensims-#                                 FROM
opensims-#                                     (SELECT b.bucket_id AS rrd_bucket_id, s.*
opensims(#                                         FROM rrd.bucket b
opensims(#                                             JOIN alert_def_type_v s
opensims(#                                                 ON (
opensims(#                                                     b.prev_end_time  < tick_tsz
opensims(#                                                     AND b.end_time >= tick_tsz )
opensims(#                                         WHERE b.rrd_id = '1'
opensims(#                                             AND b.end_time <= '2004-11-09 16:04:00-06'
opensims(#                                             AND b.end_time > '2004-11-08 16:31:00-06'
opensims(#                                     ) a
opensims-#                                 GROUP BY rrd_bucket_id, alert_type_id;
                                                                                       QUERY PLAN                                                                                        
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=3787628.37..3787916.15 rows=12790 width=24) (actual time=202.045..215.197 rows=5234 loops=1)
   ->  Hash Join  (cost=107.76..3537247.03 rows=9104776 width=24) (actual time=10.728..147.415 rows=17423 loops=1)
         Hash Cond: ("outer".alert_def_id = "inner".id)
         ->  Nested Loop  (cost=0.00..3377768.38 rows=9104775 width=24) (actual time=0.042..93.512 rows=17423 loops=1)
               ->  Index Scan using rrd_bucket__rrd_id__end_time on bucket b  (cost=0.00..101.62 rows=1279 width=20) (actual time=0.018..3.040 rows=1413 loops=1)
                     Index Cond: ((rrd_id = 1) AND (end_time <= '2004-11-09 16:04:00-06'::timestamp with time zone) AND (end_time > '2004-11-08 16:31:00-06'::timestamp with time zone))
               ->  Index Scan using alert__tick_tsz on alert  (cost=0.00..2498.49 rows=7119 width=28) (actual time=0.006..0.030 rows=12 loops=1413)
                     Index Cond: (("outer".prev_end_time < ms_t(alert.tick)) AND ("outer".end_time >= ms_t(alert.tick)))
         ->  Hash  (cost=101.66..101.66 rows=2440 width=8) (actual time=10.509..10.509 rows=0 loops=1)
               ->  Hash Join  (cost=3.13..101.66 rows=2440 width=8) (actual time=0.266..8.499 rows=2439 loops=1)
                     Hash Cond: ("outer".alert_type_id = "inner".id)
                     ->  Index Scan using alert_def_pkey on alert_def d  (cost=0.00..55.83 rows=2439 width=8) (actual time=0.009..3.368 rows=2439 loops=1)
                     ->  Hash  (cost=3.11..3.11 rows=10 width=4) (actual time=0.061..0.061 rows=0 loops=1)
                           ->  Index Scan using alert_type_pkey on alert_type t  (cost=0.00..3.11 rows=10 width=4) (actual time=0.018..0.038 rows=10 loops=1)
 Total runtime: 218.644 ms
(15 rows)

opensims=# 

I'd really like to avoid putting a 'set enable_seqscan=false' in my
code, especially since this query only has a problem if it's run on a
large date/time window, which normally doesn't happen.
-- 
Jim C. Nasby, Database Consultant               decibel@xxxxxxxxxxx 
Give your computer some brain candy! www.distributed.net Team #1828

Windows: "Where do you want to go today?"
Linux: "Where do you want to go tomorrow?"
FreeBSD: "Are you guys coming, or what?"


[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux