Partitioning: how to exclude unrelated partitions?

From: "Sean Z(dot)" <sean09182006(at)yahoo(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Partitioning: how to exclude unrelated partitions?
Date: 2007-10-26 02:30:14
Message-ID: 486875.57095.qm@web45104.mail.sp1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

I partitioned a table "events" into 31 tables, based on "day" of event_time.

I did 3 steps to setup partition, after creating partition tables:

1. Add the constraint to the 31 partition tables like:

ALTER TABLE events_day_1
ADD CONSTRAINT events_day_1_event_time_check CHECK (date_part('day'::text, event_time) = 1::double precision);

2. Add partition rules like:

CREATE OR REPLACE RULE events_insert_day_1 AS
ON INSERT TO events
WHERE date_part('day'::text, new.event_time) = 1::double precision
DO INSTEAD
INSERT INTO events_day_1 (id, event_number, event_source, event_type, event_time, event_message)
VALUES (new.id, new.event_number, new.event_source, new.event_type, new.event_time, new.event_message);

3. Set constraint_exclusion = on

But when I run the following query:

explain analyze select *
from events
where event_time > '10/25/2007 20:00:00'
order by event_time
limit 100
offset 3000;

I got the following query plan:

"Limit (cost=12897.77..12898.02 rows=100 width=144) (actual time=365.976..366.143 rows=100 loops=1)"
" -> Sort (cost=12890.27..13031.08 rows=56323 width=144) (actual time=362.225..364.929 rows=3100 loops=1)"
" Sort Key: public.events.event_time"
" -> Result (cost=0.00..4207.48 rows=56323 width=144) (actual time=0.099..156.586 rows=50091 loops=1)"
" -> Append (cost=0.00..4207.48 rows=56323 width=144) (actual time=0.095..93.748 rows=50091 loops=1)"
" -> Seq Scan on events (cost=0.00..17.25 rows=193 width=106) (actual time=0.003..0.003 rows=0 loops=1)"
" Filter: (event_time > '2007-10-25 20:00:00-04'::timestamp with time zone)"
" -> Seq Scan on events_day_1 events (cost=0.00..17.25 rows=193 width=106) (actual time=0.001..0.001 rows=0 loops=1)"
" Filter: (event_time > '2007-10-25 20:00:00-04'::timestamp with time zone)"

<... repeated lines ignored here>

" -> Index Scan using events_day_25_idx1 on events_day_25 events (cost=0.00..3672.73 rows=50340 width=144) (actual time=0.053..53.129 rows=49984 loops=1)"
" Index Cond: (event_time > '2007-10-25 20:00:00-04'::timestamp with time zone)"

<... repeated lines ignored here>

" -> Seq Scan on events_day_31 events (cost=0.00..17.25 rows=193 width=106) (actual time=0.001..0.001 rows=0 loops=1)"
" Filter: (event_time > '2007-10-25 20:00:00-04'::timestamp with time zone)"

Every partition table is "Seq Scan"ned, I think unrelated tables are not excluded in the query. Only table events_day_25 should be included in scan I believe.

Do I miss anything?

Best,
Sean

__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Responses

Browse pgsql-general by date

  From Date Subject
Next Message John D. Burger 2007-10-26 04:01:38 Re: Selecting K random rows - efficiently!
Previous Message D. Dante Lorenso 2007-10-26 02:01:53 Re: Selecting tree data