mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-23 06:22:03 +08:00
When new chunks are created, the calculated chunk hypercube might collide or not align with existing chunks when partitioning has changed in one or more dimensions. In such cases, the chunk should be cut to fit the alignment criteria and any collisions should be resolved. Unfortunately, alignment and collision detection wasn't properly handled. This refactoring adds proper axis-aligned bounding box collision detection generalized to N dimensions. It also correctly handles dimension alignment.
66 lines
2.6 KiB
SQL
66 lines
2.6 KiB
SQL
\ir include/create_single_db.sql
|
|
--
|
|
-- This test will create chunks in two dimenisions, time (x) and
|
|
-- space (y), where the time dimension is aligned. The figure below
|
|
-- shows the expected result. The chunk number in the figure
|
|
-- indicates the creation order.
|
|
--
|
|
-- +
|
|
-- +
|
|
-- + +-----+ +-----+
|
|
-- + | 2 | | 3 |
|
|
-- + | +---+-+ |
|
|
-- + +-----+ 5 |6+-----+
|
|
-- + | 1 +---+-+-----+ +---------+
|
|
-- + | | |4| 7 | | 8 |
|
|
-- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|
|
-- 0 5 10 15 20
|
|
--
|
|
-- Partitioning:
|
|
--
|
|
-- Chunk # | time | space
|
|
-- 1 | 3 | 2
|
|
-- 4 | 1 | 3
|
|
-- 5 | 5 | 3
|
|
--
|
|
|
|
CREATE TABLE chunk_test(time integer, temp float8, tag integer, color integer);
|
|
|
|
SELECT create_hypertable('chunk_test', 'time', 'tag', 2, chunk_time_interval => 3);
|
|
|
|
INSERT INTO chunk_test VALUES (4, 24.3, 3, 1);
|
|
|
|
SELECT * FROM _timescaledb_catalog.dimension_slice;
|
|
|
|
INSERT INTO chunk_test VALUES (4, 24.3, 1, 1);
|
|
INSERT INTO chunk_test VALUES (10, 24.3, 1, 1);
|
|
|
|
SELECT c.table_name AS chunk_name, d.id AS dimension_id, ds.id AS slice_id, range_start, range_end FROM _timescaledb_catalog.chunk c
|
|
LEFT JOIN _timescaledb_catalog.chunk_constraint cc ON (c.id = cc.chunk_id)
|
|
LEFT JOIN _timescaledb_catalog.dimension_slice ds ON (ds.id = cc.dimension_slice_id)
|
|
LEFT JOIN _timescaledb_catalog.dimension d ON (d.id = ds.dimension_id)
|
|
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
|
|
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test'
|
|
ORDER BY c.id, d.id;
|
|
|
|
UPDATE _timescaledb_catalog.dimension SET num_slices = 3 WHERE id = 2;
|
|
SELECT set_chunk_time_interval('chunk_test', 1::bigint);
|
|
|
|
INSERT INTO chunk_test VALUES (8, 24.3, 79669, 1);
|
|
|
|
SELECT set_chunk_time_interval('chunk_test', 5::bigint);
|
|
|
|
SELECT * FROM _timescaledb_catalog.dimension;
|
|
INSERT INTO chunk_test VALUES (7, 24.3, 11233, 1);
|
|
INSERT INTO chunk_test VALUES (8, 24.3, 11233, 1);
|
|
INSERT INTO chunk_test VALUES (10, 24.3, 79669, 1);
|
|
INSERT INTO chunk_test VALUES (16, 24.3, 79669, 1);
|
|
|
|
SELECT c.table_name AS chunk_name, d.id AS dimension_id, ds.id AS slice_id, range_start, range_end FROM _timescaledb_catalog.chunk c
|
|
LEFT JOIN _timescaledb_catalog.chunk_constraint cc ON (c.id = cc.chunk_id)
|
|
LEFT JOIN _timescaledb_catalog.dimension_slice ds ON (ds.id = cc.dimension_slice_id)
|
|
LEFT JOIN _timescaledb_catalog.dimension d ON (d.id = ds.dimension_id)
|
|
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
|
|
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test'
|
|
ORDER BY c.id, d.id;
|