postgresql分割槽表2
阿新 • • 發佈:2019-02-13
1). 建立"主表",所有分割槽都從它繼承。 create table ft ( sid int not null, sdate date not null, saddress varchar(100) )tablespace tb01; 2). 建立幾個"子"表,每個都從主表上繼承 create table ft01 (check ( sdate >= date '2015-01-01' and sdate < date '2015-02-01') ) inherits (ft) tablespace tb01; create table ft02 ( check ( sdate >= date '2015-02-01' and sdate < date '2015-03-01')) inherits (ft) tablespace tb01; create table ft03 ( check ( sdate >= date '2015-03-01' and sdate < date '2015-04-01')) inherits (ft) tablespace tb01; create table ft04 ( check ( sdate >= date '2015-04-01' and sdate < date '2015-05-01')) inherits (ft) tablespace tb01; create table ft05 ( check ( sdate >= date '2015-05-01' and sdate < date '2015-06-01')) inherits (ft) tablespace tb01; create table ft06 ( check ( sdate >= date '2015-06-01' and sdate < date '2015-07-01')) inherits (ft) tablespace tb01; create table ft07 ( check ( sdate >= date '2015-07-01' and sdate < date '2015-08-01')) inherits (ft) tablespace tb01; create table ft08 ( check ( sdate >= date '2015-08-01' and sdate < date '2015-09-01')) inherits (ft) tablespace tb01; create table ft09 ( check ( sdate >= date '2015-09-01' and sdate < date '2015-10-01')) inherits (ft) tablespace tb01; create table ft10 ( check ( sdate >= date '2015-10-01' and sdate < date '2015-11-01')) inherits (ft) tablespace tb01; create table ft11 ( check ( sdate >= date '2015-11-01' and sdate < date '2015-12-01')) inherits (ft) tablespace tb01; create table ft12 ( check ( sdate >= date '2015-12-01' and sdate < date '2016-1-01')) inherits (ft) tablespace tb01; create index index_ft01_sdate on ft01 (sdate) tablespace tb01_index; create index index_ft02_sdate on ft02 (sdate) tablespace tb01_index; create index index_ft03_sdate on ft03 (sdate) tablespace tb01_index ; create index index_ft04_sdate on ft04 (sdate) tablespace tb01_index; create index index_ft05_sdate on ft05 (sdate) tablespace tb01_index; create index index_ft06_sdate on ft06 (sdate) tablespace tb01_index; create index index_ft07_sdate on ft07 (sdate) tablespace tb01_index; create index index_ft08_sdate on ft08 (sdate) tablespace tb01_index; create index index_ft09_sdate on ft09 (sdate) tablespace tb01_index; create index index_ft10_sdate on ft10 (sdate) tablespace tb01_index; create index index_ft11_sdate on ft11 (sdate) tablespace tb01_index; create index index_ft12_sdate on ft12 (sdate) tablespace tb01_index; create or replace function ft_insert_trigger() returns trigger as $$ begin if( new.sdate between '2015-1-01' and '2015-02-01' ) then insert into ft01 values (new.*); elsif( new.sdate between '2015-2-01' and '2015-03-01' ) then insert into ft02 values (new.*); elsif( new.sdate between '2015-3-01' and '2015-04-01' ) then insert into ft03 values (new.*); elsif( new.sdate between '2015-4-01' and '2015-05-01' ) then insert into ft04 values (new.*); elsif( new.sdate between '2015-05-01' and '2015-06-01' ) then insert into ft05 values (new.*); elsif( new.sdate between '2015-06-01' and '2015-07-01' ) then insert into ft06 values (new.*); elsif( new.sdate between '2015-07-01' and '2015-08-01' ) then insert into ft07 values (new.*); elsif( new.sdate between '2015-08-01' and '2015-09-01' ) then insert into ft08 values (new.*); elsif( new.sdate between '2015-09-01' and '2015-10-01' ) then insert into ft09 values (new.*); elsif( new.sdate between '2015-10-01' and '2015-11-01' ) then insert into ft10 values (new.*); elsif( new.sdate between '2015-11-01' and '2015-12-01' ) then insert into ft11 values (new.*); elsif( new.sdate between '2015-12-01' and '2016-01-01' ) then insert into ft12 values (new.*); else raise exception '!out of range!'; end if; return null; end; $$ language plpgsql; create trigger insert_ft_trigger before insert on ft for each row execute procedure ft_insert_trigger() ; ----插入測試資料 insert into ft(sid,sdate,saddress) select n,'2015-01-03',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-02-04',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-03-05',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-04-04',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-05-05',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-06-06',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-07-07',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-08-08',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-09-09',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-10-10',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-11-11',n||':楊楂文' from generate_series(1,100) n; insert into ft(sid,sdate,saddress) select n,'2015-12-12',n||':楊楂文' from generate_series(1,100) n; ----查詢 SET constraint_exclusion = off; #EXPLAIN SELECT count(*) FROM ft WHERE sdate >= DATE '2015-01-01'; QUERY PLAN ------------------------------------------------------------------ Aggregate (cost=30.02..30.03 rows=1 width=0) -> Append (cost=0.00..27.01 rows=1202 width=0) -> Seq Scan on ft (cost=0.00..0.00 rows=1 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft01 (cost=0.00..2.26 rows=101 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft02 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft03 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft04 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft05 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft06 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft07 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft08 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft09 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft10 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft11 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft12 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) (28 rows) SET constraint_exclusion = off; #EXPLAIN SELECT count(*) FROM ft WHERE sdate >= DATE '2015-01-01'; ------------------------------------------------------------------ Aggregate (cost=30.02..30.03 rows=1 width=0) -> Append (cost=0.00..27.01 rows=1202 width=0) -> Seq Scan on ft (cost=0.00..0.00 rows=1 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft01 (cost=0.00..2.26 rows=101 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft02 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft03 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft04 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft05 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft06 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft07 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft08 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft09 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft10 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft11 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) -> Seq Scan on ft12 (cost=0.00..2.25 rows=100 width=0) Filter: (sdate >= '2015-01-01'::date) (28 rows) # EXPLAIN SELECT count(*) FROM ft WHERE sdate between '2015-03-01' and '2015-04-01'; QUERY PLAN ----------------------------------------------------------------------------------------- Aggregate (cost=5.25..5.26 rows=1 width=0) -> Append (cost=0.00..5.00 rows=102 width=0) -> Seq Scan on ft (cost=0.00..0.00 rows=1 width=0) Filter: ((sdate >= '2015-03-01'::date) AND (sdate <= '2015-04-01'::date)) -> Seq Scan on ft03 (cost=0.00..2.50 rows=100 width=0) Filter: ((sdate >= '2015-03-01'::date) AND (sdate <= '2015-04-01'::date)) -> Seq Scan on ft04 (cost=0.00..2.50 rows=1 width=0) Filter: ((sdate >= '2015-03-01'::date) AND (sdate <= '2015-04-01'::date)) (8 rows)