Search Postgresql Archives

MAX() across partition tables

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

 



Hi,

In Postgres 8.1, MAX() was rewritten to use index backward search without
doing seq_scan. This achieves a huge performance gain. But I found that when
I use MAX() on a partitioned table, it reverses back to the old seq_scan
plan. Wouldn't it be more efficient to get MAX() from each partition table
(using index) and then select the MAX() among the max values?

Attached is the EXPLAIN output. I have index on 'time' on each partition
table.

--Qiao

----------------------------------------------------------------------------
----
report_log=> explain select max(time) from url_access_base;
                                                 QUERY PLAN
----------------------------------------------------------------------------
--------------------------------
 Aggregate  (cost=542341.71..542341.72 rows=1 width=8)
   ->  Append  (cost=0.00..490943.97 rows=20559097 width=8)
         ->  Seq Scan on url_access_base  (cost=0.00..15.00 rows=500
width=8)
         ->  Seq Scan on url_access_2006_06_02 url_access_base
(cost=0.00..7728.43 rows=326343 width=8)
         ->  Seq Scan on url_access_2006_06_03 url_access_base
(cost=0.00..23818.00 rows=1005000 width=8)
         ->  Seq Scan on url_access_2006_06_04 url_access_base
(cost=0.00..23890.00 rows=1008000 width=8)
         ->  Seq Scan on url_access_2006_06_05 url_access_base
(cost=0.00..126426.85 rows=5291885 width=8)
         ->  Seq Scan on url_access_2006_05_31 url_access_base
(cost=0.00..7220.01 rows=302001 width=8)
         ->  Seq Scan on url_access_2006_05_22 url_access_base
(cost=0.00..292.11 rows=12211 width=8)
         ->  Seq Scan on url_access_2006_05_23 url_access_base
(cost=0.00..8.00 rows=300 width=8)
         ->  Seq Scan on url_access_2006_05_24 url_access_base
(cost=0.00..13021.30 rows=544630 width=8)
         ->  Seq Scan on url_access_2006_05_25 url_access_base
(cost=0.00..59.50 rows=2450 width=8)
         ->  Seq Scan on url_access_2006_05_26 url_access_base
(cost=0.00..735.00 rows=31000 width=8)
         ->  Seq Scan on url_access_2006_06_01 url_access_base
(cost=0.00..208633.43 rows=8726643 width=8)
         ->  Seq Scan on url_access_2006_06_07 url_access_base
(cost=0.00..78903.17 rows=3300017 width=8)
         ->  Seq Scan on url_access_2006_06_08 url_access_base
(cost=0.00..190.00 rows=8000 width=8)
         ->  Seq Scan on url_access_2006_05_01 url_access_base
(cost=0.00..3.17 rows=117 width=8)
(17 rows)

report_log=> explain select max(time) from url_access_2006_05_23;
                                                              QUERY PLAN
----------------------------------------------------------------------------
----------------------------------------------------------
 Result  (cost=0.03..0.04 rows=1 width=0)
   InitPlan
     ->  Limit  (cost=0.00..0.03 rows=1 width=8)
           ->  Index Scan Backward using url_access_2006_05_23_time_idx on
url_access_2006_05_23  (cost=0.00..10.30 rows=300 width=8)
                 Filter: ("time" IS NOT NULL)
(5 rows)

report_log=> explain select max(time) from url_access_2006_05_24;
                                                                 QUERY PLAN
----------------------------------------------------------------------------
----------------------------------------------------------------
 Result  (cost=0.03..0.04 rows=1 width=0)
   InitPlan
     ->  Limit  (cost=0.00..0.03 rows=1 width=8)
           ->  Index Scan Backward using url_access_2006_05_24_time_idx on
url_access_2006_05_24  (cost=0.00..15458.93 rows=544630 width=8)
                 Filter: ("time" IS NOT NULL)
(5 rows)





[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