Hi,
I'm referring to the table partitioning technique described in here :
http://www.postgresql.org/docs/9.1/static/ddl-partitioning.htmlI tend to create table partition by the following commands
DROP table measurement cascade;
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
);
CREATE TABLE measurement_y2006m02 (
CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2006m03 (
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' )
) INHERITS (measurement);
CREATE INDEX measurement_y2006m02_logdate ON measurement_y2006m02 (logdate);
CREATE INDEX measurement_y2006m03_logdate ON measurement_y2006m03 (logdate);
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.logdate >= DATE '2006-02-01' AND
NEW.logdate < DATE '2006-03-01' ) THEN
INSERT INTO measurement_y2006m02 VALUES (NEW.*);
ELSIF ( NEW.logdate >= DATE '2006-03-01' AND
NEW.logdate < DATE '2006-04-01' ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
Then, I tend to create distributed tables using
SELECT master_create_distributed_table('measurement', 'city_id');
SELECT master_create_worker_shards('measurement', 16, 2);
All seems OK.
However, when I perform insert, it doesn't work well.
postgres=# insert into measurement values(0, '2006-03-02', 22, 33);
INSERT 0 1
Time: 3.851 ms
postgres=# select * from measurement;
city_id | logdate | peaktemp | unitsales
---------+---------+----------+-----------
(0 rows)
Time: 2.965 ms
postgres=# select * from measurement_y2006m02;
measurement_y2006m02
postgres=# select * from measurement_y2006m02;
city_id | logdate | peaktemp | unitsales
---------+---------+----------+-----------
(0 rows)
Time: 1.690 ms
postgres=# select * from measurement_y2006m03;
city_id | logdate | peaktemp | unitsales
---------+---------+----------+-----------
(0 rows)
Insertion will work well, if I don't perform master_create_distributed_table and master_create_worker_shards.
I further experiment with
SELECT master_create_distributed_table('measurement', 'city_id');
SELECT master_create_distributed_table('measurement_y2006m02', 'city_id');
SELECT master_create_distributed_table('measurement_y2006m03', 'city_id');
SELECT master_create_worker_shards('measurement', 16, 2);
SELECT master_create_worker_shards('measurement_y2006m02', 16, 2);
SELECT master_create_worker_shards('measurement_y2006m03', 16, 2);
I get the following errors
postgres=# SELECT master_create_distributed_table('measurement', 'city_id');
master_create_distributed_table
---------------------------------
(1 row)
Time: 1.098 ms
postgres=# SELECT master_create_distributed_table('measurement_y2006m02', 'city_id');
master_create_distributed_table
---------------------------------
(1 row)
Time: 0.756 ms
postgres=# SELECT master_create_distributed_table('measurement_y2006m03', 'city_id');
master_create_distributed_table
---------------------------------
(1 row)
Time: 1.253 ms
postgres=# SELECT master_create_worker_shards('measurement', 16, 2);
master_create_worker_shards
-----------------------------
(1 row)
Time: 62.597 ms
postgres=# SELECT master_create_worker_shards('measurement_y2006m02', 16, 2);
WARNING: Bad result from 172.30.1.249:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.249:5432"
WARNING: Bad result from 172.30.1.250:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.250:5432"
WARNING: Bad result from 172.30.1.252:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.252:5432"
ERROR: could not satisfy specified replication factor
DETAIL: Created 0 shard replicas, less than the requested replication factor of 2.
Time: 3.662 ms
postgres=# SELECT master_create_worker_shards('measurement_y2006m03', 16, 2);
WARNING: Bad result from 172.30.1.249:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.249:5432"
WARNING: Bad result from 172.30.1.250:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.250:5432"
WARNING: Bad result from 172.30.1.252:5432
DETAIL: Remote message: column "logdate" does not exist
WARNING: could not create shard on "172.30.1.252:5432"
ERROR: could not satisfy specified replication factor
DETAIL: Created 0 shard replicas, less than the requested replication factor of 2.
Time: 4.733 ms
Does this mean, table partitioning is not supported in CitusDB?
Thanks.
Cheok