mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-22 13:40:56 +08:00
The initial support for space partitions for ordered append only supported 1 space dimension. This patch removes that restriction and supports an arbitrary amount of space partitions.
150 lines
8.2 KiB
PL/PgSQL
150 lines
8.2 KiB
PL/PgSQL
-- This file and its contents are licensed under the Apache License 2.0.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-APACHE for a copy of the license.
|
|
|
|
-- create a now() function for repeatable testing that always returns
|
|
-- the same timestamp. It needs to be marked STABLE
|
|
CREATE OR REPLACE FUNCTION now_s()
|
|
RETURNS timestamptz LANGUAGE PLPGSQL STABLE AS
|
|
$BODY$
|
|
BEGIN
|
|
RETURN '2000-01-08T0:00:00+0'::timestamptz;
|
|
END;
|
|
$BODY$;
|
|
|
|
CREATE TABLE devices(device_id INT PRIMARY KEY, name TEXT);
|
|
INSERT INTO devices VALUES
|
|
(1,'Device 1'),
|
|
(2,'Device 2'),
|
|
(3,'Device 3');
|
|
|
|
-- create a table where we create chunks in order
|
|
CREATE TABLE ordered_append(time timestamptz NOT NULL, device_id INT, value float);
|
|
SELECT create_hypertable('ordered_append','time');
|
|
CREATE index on ordered_append(time DESC,device_id);
|
|
CREATE index on ordered_append(device_id,time DESC);
|
|
|
|
INSERT INTO ordered_append SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 1, 0.5;
|
|
INSERT INTO ordered_append SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 2, 1.5;
|
|
INSERT INTO ordered_append SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 3, 2.5;
|
|
|
|
-- create a second table where we create chunks in reverse order
|
|
CREATE TABLE ordered_append_reverse(time timestamptz NOT NULL, device_id INT, value float);
|
|
SELECT create_hypertable('ordered_append_reverse','time');
|
|
|
|
INSERT INTO ordered_append_reverse SELECT generate_series('2000-01-18'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 0.5;
|
|
|
|
-- table where dimension column is last column
|
|
CREATE TABLE IF NOT EXISTS dimension_last(
|
|
id INT8 NOT NULL,
|
|
device_id INT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
time timestamptz NOT NULL
|
|
);
|
|
|
|
SELECT create_hypertable('dimension_last', 'time', chunk_time_interval => interval '1day', if_not_exists => True);
|
|
|
|
-- table with only dimension column
|
|
CREATE TABLE IF NOT EXISTS dimension_only(
|
|
time timestamptz NOT NULL
|
|
);
|
|
|
|
SELECT create_hypertable('dimension_only', 'time', chunk_time_interval => interval '1day', if_not_exists => True);
|
|
|
|
INSERT INTO dimension_last SELECT 1,1,'Device 1',generate_series('2000-01-01 0:00:00+0'::timestamptz,'2000-01-04 23:59:00+0'::timestamptz,'1m'::interval);
|
|
|
|
INSERT INTO dimension_only VALUES
|
|
('2000-01-01'),
|
|
('2000-01-03'),
|
|
('2000-01-05'),
|
|
('2000-01-07');
|
|
|
|
ANALYZE devices;
|
|
ANALYZE ordered_append;
|
|
ANALYZE ordered_append_reverse;
|
|
ANALYZE dimension_last;
|
|
ANALYZE dimension_only;
|
|
|
|
-- create hypertable with indexes not on all chunks
|
|
CREATE TABLE ht_missing_indexes(time timestamptz NOT NULL, device_id int, value float);
|
|
|
|
SELECT create_hypertable('ht_missing_indexes','time');
|
|
|
|
INSERT INTO ht_missing_indexes SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 1, 0.5;
|
|
INSERT INTO ht_missing_indexes SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 2, 1.5;
|
|
INSERT INTO ht_missing_indexes SELECT generate_series('2000-01-01'::timestamptz,'2000-01-18'::timestamptz,'1m'::interval), 3, 2.5;
|
|
|
|
-- drop index from 2nd chunk of ht_missing_indexes
|
|
SELECT format('%I.%I',i.schemaname,i.indexname) AS "INDEX_NAME"
|
|
FROM _timescaledb_catalog.chunk c
|
|
INNER JOIN _timescaledb_catalog.hypertable ht ON c.hypertable_id = ht.id
|
|
INNER JOIN pg_indexes i ON i.schemaname = c.schema_name AND i.tablename=c.table_name
|
|
WHERE ht.table_name = 'ht_missing_indexes'
|
|
ORDER BY c.id LIMIT 1 OFFSET 1 \gset
|
|
|
|
DROP INDEX :INDEX_NAME;
|
|
|
|
ANALYZE ht_missing_indexes;
|
|
|
|
-- create hypertable with with dropped columns
|
|
CREATE TABLE ht_dropped_columns(c1 int, c2 int, c3 int, c4 int, c5 int, time timestamptz NOT NULL, device_id int, value float);
|
|
|
|
SELECT create_hypertable('ht_dropped_columns','time');
|
|
|
|
ALTER TABLE ht_dropped_columns DROP COLUMN c1;
|
|
INSERT INTO ht_dropped_columns(time,device_id,value) SELECT generate_series('2000-01-01'::timestamptz,'2000-01-02'::timestamptz,'1m'::interval), 1, 0.5;
|
|
ALTER TABLE ht_dropped_columns DROP COLUMN c2;
|
|
INSERT INTO ht_dropped_columns(time,device_id,value) SELECT generate_series('2000-01-08'::timestamptz,'2000-01-09'::timestamptz,'1m'::interval), 1, 0.5;
|
|
ALTER TABLE ht_dropped_columns DROP COLUMN c3;
|
|
INSERT INTO ht_dropped_columns(time,device_id,value) SELECT generate_series('2000-01-15'::timestamptz,'2000-01-16'::timestamptz,'1m'::interval), 1, 0.5;
|
|
ALTER TABLE ht_dropped_columns DROP COLUMN c4;
|
|
INSERT INTO ht_dropped_columns(time,device_id,value) SELECT generate_series('2000-01-22'::timestamptz,'2000-01-23'::timestamptz,'1m'::interval), 1, 0.5;
|
|
ALTER TABLE ht_dropped_columns DROP COLUMN c5;
|
|
INSERT INTO ht_dropped_columns(time,device_id,value) SELECT generate_series('2000-01-29'::timestamptz,'2000-01-30'::timestamptz,'1m'::interval), 1, 0.5;
|
|
|
|
ANALYZE ht_dropped_columns;
|
|
|
|
CREATE TABLE space(time timestamptz NOT NULL, device_id int NOT NULL, value float);
|
|
SELECT create_hypertable('space','time','device_id',number_partitions:=4);
|
|
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 1.5;
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 2.5;
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 3, 3.5;
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 4, 4.5;
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 5, 5.5;
|
|
INSERT INTO space SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 6, 6.5;
|
|
|
|
ANALYZE space;
|
|
|
|
CREATE TABLE space2(time timestamptz NOT NULL, device_id int NOT NULL, tag_id int NOT NULL, value float);
|
|
SELECT create_hypertable('space2','time','device_id',number_partitions:=3);
|
|
SELECT add_dimension('space2','tag_id',number_partitions:=3);
|
|
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 1, 1.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 1, 2.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 3, 1, 3.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 2, 1.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 2, 2.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 3, 2, 3.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 3, 1.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 3, 2.5;
|
|
INSERT INTO space2 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 3, 3, 3.5;
|
|
|
|
ANALYZE space2;
|
|
|
|
CREATE TABLE space3(time timestamptz NOT NULL, x int NOT NULL, y int NOT NULL, z int NOT NULL, value float);
|
|
SELECT create_hypertable('space3','time','x',number_partitions:=2);
|
|
SELECT add_dimension('space3','y',number_partitions:=2);
|
|
SELECT add_dimension('space3','z',number_partitions:=2);
|
|
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 1, 1, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 1, 2, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 2, 1, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 1, 2, 2, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 1, 1, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 1, 2, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 2, 1, 1.5;
|
|
INSERT INTO space3 SELECT generate_series('2000-01-10'::timestamptz,'2000-01-01'::timestamptz,'-1m'::interval), 2, 2, 2, 1.5;
|
|
|
|
|