mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-28 09:46:44 +08:00
Tablespaces can now be associated with a hypertable using the new user-facing API attach_tablespace(). Alternatively, if the main table, which is to be converted into a hypertable, was created with an associated tablespace, that tablespace will automatically be associated also with the hypertable. Whenever a chunk is created, a tablespace will be chosen from the ones associated with the chunk's hypertable (if any). This is done in a way that ensures consistency in one dimension. I.e., if a hypertable has a closed (space) dimension with a fixed number of slices (ranges), it will ensure that chunks that fall in the same slice will alsp be stored in the same tablespace. If a hypertable has more than one closed dimension, the first one will be used to assign tablespaces to chunks. If the table has no closed dimensions, but one or more open (time) dimensions, then the first time dimension will be used. However, since open dimensions do not have a fixed number of slices, tablespaces will be assigned in a round-robbin fashion as new slices are created. Still, chunks in the same time slice will be stored in the same tablespace.
59 lines
2.1 KiB
SQL
59 lines
2.1 KiB
SQL
\ir include/create_single_db.sql
|
|
\set ON_ERROR_STOP 0
|
|
|
|
SET client_min_messages = ERROR;
|
|
DROP TABLESPACE IF EXISTS tablespace1;
|
|
DROP TABLESPACE IF EXISTS tablespace2;
|
|
SET client_min_messages = NOTICE;
|
|
|
|
--test hypertable with tables space
|
|
CREATE TABLESPACE tablespace1 LOCATION :TEST_TABLESPACE1_PATH;
|
|
|
|
--assigning a tablespace via the main table should work
|
|
CREATE TABLE tspace_2dim(time timestamp, temp float, device text) TABLESPACE tablespace1;
|
|
SELECT create_hypertable('tspace_2dim', 'time', 'device', 2);
|
|
|
|
INSERT INTO tspace_2dim VALUES ('2017-01-20T09:00:01', 24.3, 'blue');
|
|
|
|
--verify that the table chunk has the correct tablespace
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--attach another tablespace without first creating it --> should generate error
|
|
SELECT attach_tablespace('tspace_2dim', 'tablespace2');
|
|
--attach the same tablespace twice to same table should also generate error
|
|
SELECT attach_tablespace('tspace_2dim', 'tablespace1');
|
|
|
|
CREATE TABLESPACE tablespace2 LOCATION :TEST_TABLESPACE2_PATH;
|
|
|
|
--attach after creating --> should work
|
|
SELECT attach_tablespace('tspace_2dim', 'tablespace2');
|
|
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
|
|
--insert into another chunk
|
|
INSERT INTO tspace_2dim VALUES ('2017-01-20T09:00:01', 24.3, 'brown');
|
|
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--
|
|
CREATE TABLE tspace_1dim(time timestamp, temp float, device text) TABLESPACE tablespace1;
|
|
SELECT create_hypertable('tspace_1dim', 'time');
|
|
SELECT attach_tablespace('tspace_1dim', 'tablespace2');
|
|
|
|
INSERT INTO tspace_1dim VALUES ('2017-01-20T09:00:01', 24.3, 'blue');
|
|
INSERT INTO tspace_1dim VALUES ('2017-03-20T09:00:01', 24.3, 'brown');
|
|
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--cleanup
|
|
DROP TABLE tspace_1dim CASCADE;
|
|
DROP TABLE tspace_2dim CASCADE;
|
|
DROP TABLESPACE tablespace1;
|
|
DROP TABLESPACE tablespace2;
|