diff --git a/.unreleased/pr_6630 b/.unreleased/pr_6630 new file mode 100644 index 000000000..1f5774445 --- /dev/null +++ b/.unreleased/pr_6630 @@ -0,0 +1 @@ +Implements: #6630 Add views for per chunk compression settings diff --git a/sql/updates/latest-dev.sql b/sql/updates/latest-dev.sql index 6e4caca59..bd64dc2cc 100644 --- a/sql/updates/latest-dev.sql +++ b/sql/updates/latest-dev.sql @@ -16,3 +16,52 @@ DROP FUNCTION IF EXISTS _timescaledb_functions.invalidation_process_cagg_log(int DROP FUNCTION IF EXISTS _timescaledb_functions.invalidation_process_hypertable_log(integer,integer,regtype,integer[],bigint[],bigint[]); DROP FUNCTION IF EXISTS _timescaledb_functions.invalidation_process_hypertable_log(integer,integer,regtype,integer[],bigint[],bigint[],text[]); DROP FUNCTION IF EXISTS _timescaledb_functions.hypertable_invalidation_log_delete(integer); + +CREATE VIEW timescaledb_information.hypertable_compression_settings AS + SELECT + format('%I.%I',ht.schema_name,ht.table_name)::regclass AS hypertable, + array_to_string(segmentby,',') AS segmentby, + un.orderby, + d.compress_interval_length + FROM _timescaledb_catalog.hypertable ht + JOIN LATERAL ( + SELECT + CASE WHEN d.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN + _timescaledb_functions.to_interval(d.compress_interval_length)::text + ELSE + d.compress_interval_length::text + END AS compress_interval_length + FROM _timescaledb_catalog.dimension d WHERE d.hypertable_id = ht.id ORDER BY id LIMIT 1 + ) d ON true + LEFT JOIN _timescaledb_catalog.compression_settings s ON format('%I.%I',ht.schema_name,ht.table_name)::regclass = s.relid + LEFT JOIN LATERAL ( + SELECT + string_agg( + format('%I%s%s',orderby, + CASE WHEN "desc" THEN ' DESC' ELSE '' END, + CASE WHEN nullsfirst AND NOT "desc" THEN ' NULLS FIRST' WHEN NOT nullsfirst AND "desc" THEN ' NULLS LAST' ELSE '' END + ) + ,',') AS orderby + FROM unnest(s.orderby, s.orderby_desc, s.orderby_nullsfirst) un(orderby, "desc", nullsfirst) + ) un ON true; + +CREATE VIEW timescaledb_information.chunk_compression_settings AS + SELECT + format('%I.%I',ht.schema_name,ht.table_name)::regclass AS hypertable, + format('%I.%I',ch.schema_name,ch.table_name)::regclass AS chunk, + array_to_string(segmentby,',') AS segmentby, + un.orderby + FROM _timescaledb_catalog.hypertable ht + INNER JOIN _timescaledb_catalog.chunk ch ON ch.hypertable_id = ht.id + INNER JOIN _timescaledb_catalog.chunk ch2 ON ch2.id = ch.compressed_chunk_id + LEFT JOIN _timescaledb_catalog.compression_settings s ON format('%I.%I',ch2.schema_name,ch2.table_name)::regclass = s.relid + LEFT JOIN LATERAL ( + SELECT + string_agg( + format('%I%s%s',orderby, + CASE WHEN "desc" THEN ' DESC' ELSE '' END, + CASE WHEN nullsfirst AND NOT "desc" THEN ' NULLS FIRST' WHEN NOT nullsfirst AND "desc" THEN ' NULLS LAST' ELSE '' END + ),',') AS orderby + FROM unnest(s.orderby, s.orderby_desc, s.orderby_nullsfirst) un(orderby, "desc", nullsfirst) + ) un ON true; + diff --git a/sql/updates/reverse-dev.sql b/sql/updates/reverse-dev.sql index e69de29bb..f4aa6e9eb 100644 --- a/sql/updates/reverse-dev.sql +++ b/sql/updates/reverse-dev.sql @@ -0,0 +1,4 @@ + +DROP VIEW IF EXISTS timescaledb_information.hypertable_compression_settings; +DROP VIEW IF EXISTS timescaledb_information.chunk_compression_settings; + diff --git a/sql/views.sql b/sql/views.sql index 29033553a..b0f45f5cb 100644 --- a/sql/views.sql +++ b/sql/views.sql @@ -159,30 +159,22 @@ FROM ( dim.column_name AS primary_dimension, dim.column_type AS primary_dimension_type, row_number() OVER (PARTITION BY chcons.chunk_id ORDER BY dim.id) AS chunk_dimension_num, - CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype) THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN _timescaledb_functions.to_timestamp(dimsl.range_start) ELSE NULL END AS range_start, - CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype) THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN _timescaledb_functions.to_timestamp(dimsl.range_end) ELSE NULL END AS range_end, - CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype) THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN NULL ELSE dimsl.range_start END AS integer_range_start, - CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype) THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN NULL ELSE dimsl.range_end @@ -228,18 +220,14 @@ SELECT ht.schema_name AS hypertable_schema, 'Time' END AS dimension_type, CASE WHEN dim.interval_length IS NOT NULL THEN - CASE WHEN dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN _timescaledb_functions.to_interval(dim.interval_length) ELSE NULL END END AS time_interval, CASE WHEN dim.interval_length IS NOT NULL THEN - CASE WHEN dim.column_type = 'TIMESTAMP'::regtype - OR dim.column_type = 'TIMESTAMPTZ'::regtype - OR dim.column_type = 'DATE'::regtype THEN + CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN NULL ELSE dim.interval_length @@ -325,4 +313,54 @@ WHERE 'MEMBER') IS TRUE OR pg_catalog.pg_has_role(current_user, owner, 'MEMBER') IS TRUE; +CREATE OR REPLACE VIEW timescaledb_information.hypertable_compression_settings AS + SELECT + format('%I.%I',ht.schema_name,ht.table_name)::regclass AS hypertable, + array_to_string(segmentby,',') AS segmentby, + un.orderby, + d.compress_interval_length + FROM _timescaledb_catalog.hypertable ht + JOIN LATERAL ( + SELECT + CASE WHEN d.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN + _timescaledb_functions.to_interval(d.compress_interval_length)::text + ELSE + d.compress_interval_length::text + END AS compress_interval_length + FROM _timescaledb_catalog.dimension d WHERE d.hypertable_id = ht.id ORDER BY id LIMIT 1 + ) d ON true + LEFT JOIN _timescaledb_catalog.compression_settings s ON format('%I.%I',ht.schema_name,ht.table_name)::regclass = s.relid + LEFT JOIN LATERAL ( + SELECT + string_agg( + format('%I%s%s',orderby, + CASE WHEN "desc" THEN ' DESC' ELSE '' END, + CASE WHEN nullsfirst AND NOT "desc" THEN ' NULLS FIRST' WHEN NOT nullsfirst AND "desc" THEN ' NULLS LAST' ELSE '' END + ) + ,',') AS orderby + FROM unnest(s.orderby, s.orderby_desc, s.orderby_nullsfirst) un(orderby, "desc", nullsfirst) + ) un ON true; + +CREATE OR REPLACE VIEW timescaledb_information.chunk_compression_settings AS + SELECT + format('%I.%I',ht.schema_name,ht.table_name)::regclass AS hypertable, + format('%I.%I',ch.schema_name,ch.table_name)::regclass AS chunk, + array_to_string(segmentby,',') AS segmentby, + un.orderby + FROM _timescaledb_catalog.hypertable ht + INNER JOIN _timescaledb_catalog.chunk ch ON ch.hypertable_id = ht.id + INNER JOIN _timescaledb_catalog.chunk ch2 ON ch2.id = ch.compressed_chunk_id + LEFT JOIN _timescaledb_catalog.compression_settings s ON format('%I.%I',ch2.schema_name,ch2.table_name)::regclass = s.relid + LEFT JOIN LATERAL ( + SELECT + string_agg( + format('%I%s%s',orderby, + CASE WHEN "desc" THEN ' DESC' ELSE '' END, + CASE WHEN nullsfirst AND NOT "desc" THEN ' NULLS FIRST' WHEN NOT nullsfirst AND "desc" THEN ' NULLS LAST' ELSE '' END + ) + ,',') AS orderby + FROM unnest(s.orderby, s.orderby_desc, s.orderby_nullsfirst) un(orderby, "desc", nullsfirst) + ) un ON true; + GRANT SELECT ON ALL TABLES IN SCHEMA timescaledb_information TO PUBLIC; + diff --git a/test/expected/pg_dump.out b/test/expected/pg_dump.out index bacd9bf97..a38b6a4e9 100644 --- a/test/expected/pg_dump.out +++ b/test/expected/pg_dump.out @@ -556,8 +556,8 @@ WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND classid='pg_catalog.pg_class'::pg_catalog.regclass AND objid NOT IN (select unnest(extconfig) from pg_extension where extname='timescaledb') ORDER BY objid::regclass::text COLLATE "C"; - objid ---------------------------------------------------- + objid +--------------------------------------------------------- _timescaledb_cache.cache_inval_bgw_job _timescaledb_cache.cache_inval_extension _timescaledb_cache.cache_inval_hypertable @@ -570,15 +570,17 @@ WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND _timescaledb_internal.hypertable_chunk_local_size _timescaledb_internal.job_errors timescaledb_experimental.policies + timescaledb_information.chunk_compression_settings timescaledb_information.chunks timescaledb_information.compression_settings timescaledb_information.continuous_aggregates timescaledb_information.dimensions + timescaledb_information.hypertable_compression_settings timescaledb_information.hypertables timescaledb_information.job_errors timescaledb_information.job_stats timescaledb_information.jobs -(20 rows) +(22 rows) -- Make sure we can't run our restoring functions as a normal perm user as that would disable functionality for the whole db \c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER diff --git a/tsl/test/expected/compression_settings.out b/tsl/test/expected/compression_settings.out index 717763b3d..4fe1f4a9d 100644 --- a/tsl/test/expected/compression_settings.out +++ b/tsl/test/expected/compression_settings.out @@ -3,6 +3,8 @@ -- LICENSE-TIMESCALE for a copy of the license. \set ECHO ALL CREATE VIEW settings AS SELECT * FROM _timescaledb_catalog.compression_settings ORDER BY upper(relid::text) COLLATE "C"; +CREATE VIEW ht_settings AS SELECT * FROM timescaledb_information.hypertable_compression_settings ORDER BY upper(hypertable::text) COLLATE "C"; +CREATE VIEW chunk_settings AS SELECT * FROM timescaledb_information.chunk_compression_settings ORDER BY upper(hypertable::text) COLLATE "C", upper(chunk::text) COLLATE "C"; CREATE TABLE metrics(time timestamptz not null, device text, value float); SELECT table_name FROM create_hypertable('metrics','time'); table_name @@ -17,6 +19,17 @@ SELECT * FROM settings; metrics | {device} | {time} | {t} | {t} (1 row) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | device | "time" DESC | +(1 row) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+-------+-----------+--------- +(0 rows) + -- create 2 chunks INSERT INTO metrics VALUES ('2000-01-01'), ('2001-01-01'); -- no change to settings @@ -36,13 +49,19 @@ INFO: compress_chunk_tuplesort_start (1 row) RESET timescaledb.debug_compression_path_info; -SELECT * FROM _timescaledb_catalog.compression_settings; +SELECT * FROM settings; relid | segmentby | orderby | orderby_desc | orderby_nullsfirst ------------------------------------------------+-----------+---------+--------------+-------------------- metrics | {device} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_2_3_chunk | {device} | {time} | {t} | {t} (2 rows) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_1_1_chunk | device | "time" DESC +(1 row) + SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); compress_chunk ---------------------------------------- @@ -57,6 +76,13 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t} (3 rows) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_1_1_chunk | device | "time" DESC + metrics | _timescaledb_internal._hyper_1_2_chunk | device | "time" DESC +(2 rows) + -- dropping chunk should remove that chunks compression settings DROP TABLE _timescaledb_internal._hyper_1_1_chunk; SELECT * FROM settings; @@ -66,6 +92,12 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t} (2 rows) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_1_2_chunk | device | "time" DESC +(1 row) + -- decompress_chunk should remove settings for that chunk SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk'); decompress_chunk @@ -79,6 +111,11 @@ SELECT * FROM settings; metrics | {device} | {time} | {t} | {t} (1 row) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+-------+-----------+--------- +(0 rows) + -- compress_chunk should add settings back SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); compress_chunk @@ -93,6 +130,12 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_2_5_chunk | {device} | {time} | {t} | {t} (2 rows) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_1_2_chunk | device | "time" DESC +(1 row) + -- dropping hypertable should remove all settings DROP TABLE metrics; SELECT * FROM settings; @@ -100,6 +143,16 @@ SELECT * FROM settings; -------+-----------+---------+--------------+-------------------- (0 rows) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+---------+-------------------------- +(0 rows) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+-------+-----------+--------- +(0 rows) + CREATE TABLE metrics(time timestamptz not null, d1 text, d2 text, value float); SELECT table_name FROM create_hypertable('metrics','time'); table_name @@ -115,6 +168,12 @@ SELECT * FROM settings; metrics | | {time} | {t} | {t} (1 row) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | | "time" DESC | +(1 row) + -- create chunk INSERT INTO metrics VALUES ('2000-01-01'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1'); @@ -125,6 +184,12 @@ SELECT * FROM settings; metrics | {d1} | {time} | {t} | {t} (1 row) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | d1 | "time" DESC | +(1 row) + SELECT compress_chunk(show_chunks('metrics')); compress_chunk ---------------------------------------- @@ -139,6 +204,12 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} (2 rows) +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_3_6_chunk | d1 | "time" DESC +(1 row) + -- changing settings should update settings for hypertable but not existing compressed chunks ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); SELECT * FROM settings; @@ -148,6 +219,18 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} (2 rows) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | d2 | "time" DESC | +(1 row) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_3_6_chunk | d1 | "time" DESC +(1 row) + -- changing settings should update settings for hypertable but not existing compressed chunks ALTER TABLE metrics SET (timescaledb.compress_segmentby=''); SELECT * FROM settings; @@ -157,6 +240,18 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} (2 rows) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | | "time" DESC | +(1 row) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_3_6_chunk | d1 | "time" DESC +(1 row) + -- create another chunk INSERT INTO metrics VALUES ('2000-02-01'); SELECT compress_chunk(show_chunks('metrics'), true); @@ -175,23 +270,23 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_4_9_chunk | | {time} | {t} | {t} (3 rows) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | | "time" DESC | +(1 row) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_3_6_chunk | d1 | "time" DESC + metrics | _timescaledb_internal._hyper_3_8_chunk | | "time" DESC +(2 rows) + ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); SELECT format('%I.%I', schema_name, table_name) AS "CHUNK" FROM _timescaledb_catalog.chunk WHERE compressed_chunk_id IS NOT NULL ORDER BY id LIMIT 1 OFFSET 1\gset -- recompressing chunks should apply current hypertable settings -SELECT decompress_chunk(:'CHUNK'); - decompress_chunk ----------------------------------------- - _timescaledb_internal._hyper_3_8_chunk -(1 row) - -SELECT * FROM settings; - relid | segmentby | orderby | orderby_desc | orderby_nullsfirst -------------------------------------------------+-----------+---------+--------------+-------------------- - metrics | {d2} | {time} | {t} | {t} - _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} -(2 rows) - -SELECT compress_chunk(:'CHUNK'); +SELECT compress_chunk(:'CHUNK', recompress:=true); compress_chunk ---------------------------------------- _timescaledb_internal._hyper_3_8_chunk @@ -205,3 +300,47 @@ SELECT * FROM settings; _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} (3 rows) +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | d2 | "time" DESC | +(1 row) + +SELECT * FROM chunk_settings; + hypertable | chunk | segmentby | orderby +------------+----------------------------------------+-----------+------------- + metrics | _timescaledb_internal._hyper_3_6_chunk | d1 | "time" DESC + metrics | _timescaledb_internal._hyper_3_8_chunk | d2 | "time" DESC +(2 rows) + +-- test different order by flags with compression settings view +CREATE TABLE metrics2(time timestamptz not null, d1 text, d2 text, value float); +SELECT create_hypertable('metrics2','time'); + create_hypertable +----------------------- + (5,public,metrics2,t) +(1 row) + +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-------------+-------------------------- + metrics | d2 | "time" DESC | + metrics2 | | | +(2 rows) + +ALTER TABLE metrics2 SET (timescaledb.compress_orderby='d1 NULLS FIRST, d2 NULLS LAST, time, value ASC'); +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+--------------------------------+-------------------------- + metrics | d2 | "time" DESC | + metrics2 | | d1 NULLS FIRST,d2,"time",value | +(2 rows) + +ALTER TABLE metrics2 SET (timescaledb.compress_orderby='d1 DESC NULLS LAST, d2 ASC NULLS FIRST, value DESC, time ASC NULLS FIRST'); +SELECT * FROM ht_settings; + hypertable | segmentby | orderby | compress_interval_length +------------+-----------+-----------------------------------------------------------------+-------------------------- + metrics | d2 | "time" DESC | + metrics2 | | d1 DESC NULLS LAST,d2 NULLS FIRST,value DESC,"time" NULLS FIRST | +(2 rows) + diff --git a/tsl/test/sql/compression_settings.sql b/tsl/test/sql/compression_settings.sql index 478e64a76..c646ef864 100644 --- a/tsl/test/sql/compression_settings.sql +++ b/tsl/test/sql/compression_settings.sql @@ -5,12 +5,16 @@ \set ECHO ALL CREATE VIEW settings AS SELECT * FROM _timescaledb_catalog.compression_settings ORDER BY upper(relid::text) COLLATE "C"; +CREATE VIEW ht_settings AS SELECT * FROM timescaledb_information.hypertable_compression_settings ORDER BY upper(hypertable::text) COLLATE "C"; +CREATE VIEW chunk_settings AS SELECT * FROM timescaledb_information.chunk_compression_settings ORDER BY upper(hypertable::text) COLLATE "C", upper(chunk::text) COLLATE "C"; CREATE TABLE metrics(time timestamptz not null, device text, value float); SELECT table_name FROM create_hypertable('metrics','time'); ALTER TABLE metrics SET (timescaledb.compress, timescaledb.compress_segmentby='device'); SELECT * FROM settings; +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; -- create 2 chunks INSERT INTO metrics VALUES ('2000-01-01'), ('2001-01-01'); @@ -22,26 +26,33 @@ SET timescaledb.debug_compression_path_info= 'on'; SELECT compress_chunk('_timescaledb_internal._hyper_1_1_chunk'); RESET timescaledb.debug_compression_path_info; -SELECT * FROM _timescaledb_catalog.compression_settings; +SELECT * FROM settings; +SELECT * FROM chunk_settings; SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT * FROM settings; +SELECT * FROM chunk_settings; -- dropping chunk should remove that chunks compression settings DROP TABLE _timescaledb_internal._hyper_1_1_chunk; SELECT * FROM settings; +SELECT * FROM chunk_settings; -- decompress_chunk should remove settings for that chunk SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT * FROM settings; +SELECT * FROM chunk_settings; -- compress_chunk should add settings back SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT * FROM settings; +SELECT * FROM chunk_settings; -- dropping hypertable should remove all settings DROP TABLE metrics; SELECT * FROM settings; +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; CREATE TABLE metrics(time timestamptz not null, d1 text, d2 text, value float); SELECT table_name FROM create_hypertable('metrics','time'); @@ -49,39 +60,56 @@ SELECT table_name FROM create_hypertable('metrics','time'); ALTER TABLE metrics SET (timescaledb.compress); -- hypertable should have default settings now SELECT * FROM settings; +SELECT * FROM ht_settings; -- create chunk INSERT INTO metrics VALUES ('2000-01-01'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1'); -- settings should be updated SELECT * FROM settings; +SELECT * FROM ht_settings; SELECT compress_chunk(show_chunks('metrics')); -- settings for compressed chunk should be present SELECT * FROM settings; +SELECT * FROM chunk_settings; -- changing settings should update settings for hypertable but not existing compressed chunks ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); SELECT * FROM settings; +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; -- changing settings should update settings for hypertable but not existing compressed chunks ALTER TABLE metrics SET (timescaledb.compress_segmentby=''); SELECT * FROM settings; +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; -- create another chunk INSERT INTO metrics VALUES ('2000-02-01'); SELECT compress_chunk(show_chunks('metrics'), true); SELECT * FROM settings; +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); SELECT format('%I.%I', schema_name, table_name) AS "CHUNK" FROM _timescaledb_catalog.chunk WHERE compressed_chunk_id IS NOT NULL ORDER BY id LIMIT 1 OFFSET 1\gset -- recompressing chunks should apply current hypertable settings -SELECT decompress_chunk(:'CHUNK'); -SELECT * FROM settings; -SELECT compress_chunk(:'CHUNK'); +SELECT compress_chunk(:'CHUNK', recompress:=true); SELECT * FROM settings; - +SELECT * FROM ht_settings; +SELECT * FROM chunk_settings; + +-- test different order by flags with compression settings view +CREATE TABLE metrics2(time timestamptz not null, d1 text, d2 text, value float); +SELECT create_hypertable('metrics2','time'); +SELECT * FROM ht_settings; +ALTER TABLE metrics2 SET (timescaledb.compress_orderby='d1 NULLS FIRST, d2 NULLS LAST, time, value ASC'); +SELECT * FROM ht_settings; +ALTER TABLE metrics2 SET (timescaledb.compress_orderby='d1 DESC NULLS LAST, d2 ASC NULLS FIRST, value DESC, time ASC NULLS FIRST'); +SELECT * FROM ht_settings;