PostgreSQL creates a table partition


The steps to create a table partition are as follows: **1. Create the main table **CREATE TABLE users ( uid int not null primary key, name varchar(20)); 2. Create a partitioned table (you must inherit from the main table above) CREATE TABLE users_0 ( check (uid > = 0 and uid < 100) ) INHERITS (users); CREATE TABLE users_1 ( check (uid > = 100)) INHERITS (users); 3. Create an index on a partitioned table CREATE INDEX users_0_uidindex on users_0(uid); CREATE INDEX users_1_uidindex on users_1(uid); 4. Create rule RULE CREATE RULE users_insert_0 AS ON INSERT TO users WHERE (uid > = 0 and uid < 100) DO INSTEAD INSERT INTO users_0 VALUES (NEW.uid,NEW.name); CREATE RULE users_insert_1 AS ON INSERT TO users WHERE (uid > = 100) DO INSTEAD INSERT INTO users_1 VALUES (NEW.uid,NEW.name); Now you can test the write data: postgres=# INSERT INTO users VALUES (100,‘smallfish’); INSERT 0 0 postgres=# INSERT INTO users VALUES (20,‘aaaaa’); INSERT 0 0 postgres=# select * from users; uid | name -----+----------- 20 | aaaaa 100 | smallfish (2 data columns) postgres=# select * from users_0; uid | name -----+------- 20 | aaaaa (1 data column) postgres=# select * from users_1; uid | name -----+----------- 100 | smallfish (1 data column) Here the table partition can be calculated, but there is still a place to change, first look at the count query. postgres=# EXPLAIN SELECT count(*) FROM users where uid < 100; QUERY PLAN --------------------------------------------------------------------------------------------- Aggregate (cost=62.75..62.76 rows=1 width=0) - > Append (cost=6.52..60.55 rows=879 width=0) - > Bitmap Heap Scan on users (cost=6.52..20.18 rows=293 width=0) Recheck Cond: (uid < 100) - > Bitmap Index Scan on users_pkey (cost=0.00..6.45 rows=293 width=0) Index Cond: (uid < 100) - > Bitmap Heap Scan on users_0 users (cost=6.52..20.18 rows=293 width=0) Recheck Cond: (uid < 100) - > Bitmap Index Scan on users_0_uidindex (cost=0.00..6.45 rows=293 width=0) Index Cond: (uid < 100) - > Bitmap Heap Scan on users_1 users (cost=6.52..20.18 rows=293 width=0) Recheck Cond: (uid < 100) - > Bitmap Index Scan on users_1_uidindex (cost=0.00..6.45 rows=293 width=0) Index Cond: (uid < 100) (14 data columns) According to the original idea, uid is less than 100, so in theory, it should only query users_0 table, through which EXPLAIN can see other tables that he has scanned all partitions. postgres=# SET constraint_exclusion = on; SET postgres=# EXPLAIN SELECT count(*) FROM users where uid < 100; QUERY PLAN --------------------------------------------------------------------------------------------- Aggregate (cost=41.83..41.84 rows=1 width=0) - > Append (cost=6.52..40.37 rows=586 width=0) - > Bitmap Heap Scan on users (cost=6.52..20.18 rows=293 width=0) Recheck Cond: (uid < 100) - > Bitmap Index Scan on users_pkey (cost=0.00..6.45 rows=293 width=0) Index Cond: (uid < 100) - > Bitmap Heap Scan on users_0 users (cost=6.52..20.18 rows=293 width=0) Recheck Cond: (uid < 100) - > Bitmap Index Scan on users_0_uidindex (cost=0.00..6.45 rows=293 width=0) Index Cond: (uid < 100) (10 data columns) The whole process here is OK!