Skip to content

Commit a9d1f38

Browse files
committed
Add support for splitting a chunk
A chunk can be split with a new procedure called split_chunk(). In this initial version, a chunk can only be split in two given a split point: ``` call split_chunk('chunk_1', split_at => '2025-03-01 00:00'); ``` If no split point is given, the chunk is split in two equal size partition ranges. The partitioning dimension/column to split along can also be specified, but only the primary dimension (time) is supported. Future updates to split_chunk() can add the ability to split also along other dimensions, e.g., space partitions. Currently, splitting a chunk takes an AccessExclusiveLock on the chunk being split. A lock is also taken on the hypertable root to prevent new chunks being created while the split is ongoing.
1 parent 8298c9b commit a9d1f38

12 files changed

+894
-2
lines changed

.unreleased/pr_7946

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implements: #7946 Add support for splitting a chunk

sql/maintenance_utils.sql

+7
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ CREATE OR REPLACE PROCEDURE @[email protected]_chunks(
6565
chunks REGCLASS[]
6666
) LANGUAGE C AS '@MODULE_PATHNAME@', 'ts_merge_chunks';
6767

68+
CREATE OR REPLACE PROCEDURE @[email protected]_chunk(
69+
chunk REGCLASS,
70+
column_name NAME = NULL,
71+
split_at "any" = NULL,
72+
verbose bool = false
73+
) LANGUAGE C AS '@MODULE_PATHNAME@', 'ts_split_chunk';
74+
6875
CREATE OR REPLACE FUNCTION _timescaledb_functions.recompress_chunk_segmentwise(
6976
uncompressed_chunk REGCLASS,
7077
if_compressed BOOLEAN = true

sql/updates/latest-dev.sql

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
21
DROP FUNCTION IF EXISTS _timescaledb_internal.create_chunk_table;
32
DROP FUNCTION IF EXISTS _timescaledb_functions.create_chunk_table;
43

4+
-- Split chunk
5+
CREATE PROCEDURE @[email protected]_chunk(
6+
chunk REGCLASS,
7+
column_name NAME = NULL,
8+
split_at "any" = NULL,
9+
verbose bool = false
10+
) LANGUAGE C AS '@MODULE_PATHNAME@', 'ts_update_placeholder';

sql/updates/reverse-dev.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
21
CREATE FUNCTION _timescaledb_internal.create_chunk_table(hypertable REGCLASS, slices JSONB, schema_name NAME, table_name NAME) RETURNS BOOL AS '@MODULE_PATHNAME@', 'ts_update_placeholder' LANGUAGE C VOLATILE;
32
CREATE FUNCTION _timescaledb_functions.create_chunk_table(hypertable REGCLASS, slices JSONB, schema_name NAME, table_name NAME) RETURNS BOOL AS '@MODULE_PATHNAME@', 'ts_update_placeholder' LANGUAGE C VOLATILE;
3+
4+
-- Split chunk
5+
DROP PROCEDURE IF EXISTS @[email protected]_chunks(chunk REGCLASS, column_name NAME, split_at "any", verbose bool);

src/cross_module_fn.c

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ CROSSMODULE_WRAPPER(chunk_unfreeze_chunk);
100100
CROSSMODULE_WRAPPER(recompress_chunk_segmentwise);
101101
CROSSMODULE_WRAPPER(get_compressed_chunk_index_for_recompression);
102102
CROSSMODULE_WRAPPER(merge_chunks);
103+
CROSSMODULE_WRAPPER(split_chunk);
103104

104105
/* hypercore */
105106
CROSSMODULE_WRAPPER(is_compressed_tid);
@@ -432,6 +433,7 @@ TSDLLEXPORT CrossModuleFunctions ts_cm_functions_default = {
432433
.get_compressed_chunk_index_for_recompression = error_no_default_fn_pg_community,
433434
.preprocess_query_tsl = preprocess_query_tsl_default_fn_community,
434435
.merge_chunks = error_no_default_fn_pg_community,
436+
.split_chunk = error_no_default_fn_pg_community,
435437
};
436438

437439
TSDLLEXPORT CrossModuleFunctions *ts_cm_functions = &ts_cm_functions_default;

src/cross_module_fn.h

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ typedef struct CrossModuleFunctions
164164
PGFunction get_compressed_chunk_index_for_recompression;
165165
void (*preprocess_query_tsl)(Query *parse, int *cursor_opts);
166166
PGFunction merge_chunks;
167+
PGFunction split_chunk;
167168
} CrossModuleFunctions;
168169

169170
extern TSDLLEXPORT CrossModuleFunctions *ts_cm_functions;

0 commit comments

Comments
 (0)