Add compression settings informational view

This patch adds 2 new views hypertable_compression_settings and
chunk_compression_settings to query the per chunk compression
settings.
This commit is contained in:
Sven Klemm 2024-02-10 12:53:29 +01:00 committed by Sven Klemm
parent fa5c0a9b22
commit ea6d826c12
7 changed files with 302 additions and 41 deletions

1
.unreleased/pr_6630 Normal file
View File

@ -0,0 +1 @@
Implements: #6630 Add views for per chunk compression settings

View File

@ -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[]);
DROP FUNCTION IF EXISTS _timescaledb_functions.invalidation_process_hypertable_log(integer,integer,regtype,integer[],bigint[],bigint[],text[]); 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); 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;

View File

@ -0,0 +1,4 @@
DROP VIEW IF EXISTS timescaledb_information.hypertable_compression_settings;
DROP VIEW IF EXISTS timescaledb_information.chunk_compression_settings;

View File

@ -159,30 +159,22 @@ FROM (
dim.column_name AS primary_dimension, dim.column_name AS primary_dimension,
dim.column_type AS primary_dimension_type, dim.column_type AS primary_dimension_type,
row_number() OVER (PARTITION BY chcons.chunk_id ORDER BY dim.id) AS chunk_dimension_num, row_number() OVER (PARTITION BY chcons.chunk_id ORDER BY dim.id) AS chunk_dimension_num,
CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype) THEN
_timescaledb_functions.to_timestamp(dimsl.range_start) _timescaledb_functions.to_timestamp(dimsl.range_start)
ELSE ELSE
NULL NULL
END AS range_start, END AS range_start,
CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype) THEN
_timescaledb_functions.to_timestamp(dimsl.range_end) _timescaledb_functions.to_timestamp(dimsl.range_end)
ELSE ELSE
NULL NULL
END AS range_end, END AS range_end,
CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype) THEN
NULL NULL
ELSE ELSE
dimsl.range_start dimsl.range_start
END AS integer_range_start, END AS integer_range_start,
CASE WHEN (dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype) THEN
NULL NULL
ELSE ELSE
dimsl.range_end dimsl.range_end
@ -228,18 +220,14 @@ SELECT ht.schema_name AS hypertable_schema,
'Time' 'Time'
END AS dimension_type, END AS dimension_type,
CASE WHEN dim.interval_length IS NOT NULL THEN CASE WHEN dim.interval_length IS NOT NULL THEN
CASE WHEN dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype THEN
_timescaledb_functions.to_interval(dim.interval_length) _timescaledb_functions.to_interval(dim.interval_length)
ELSE ELSE
NULL NULL
END END
END AS time_interval, END AS time_interval,
CASE WHEN dim.interval_length IS NOT NULL THEN CASE WHEN dim.interval_length IS NOT NULL THEN
CASE WHEN dim.column_type = 'TIMESTAMP'::regtype CASE WHEN dim.column_type = ANY(ARRAY['timestamp','timestamptz','date']::regtype[]) THEN
OR dim.column_type = 'TIMESTAMPTZ'::regtype
OR dim.column_type = 'DATE'::regtype THEN
NULL NULL
ELSE ELSE
dim.interval_length dim.interval_length
@ -325,4 +313,54 @@ WHERE
'MEMBER') IS TRUE 'MEMBER') IS TRUE
OR pg_catalog.pg_has_role(current_user, owner, '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; GRANT SELECT ON ALL TABLES IN SCHEMA timescaledb_information TO PUBLIC;

View File

@ -556,8 +556,8 @@ WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND
classid='pg_catalog.pg_class'::pg_catalog.regclass classid='pg_catalog.pg_class'::pg_catalog.regclass
AND objid NOT IN (select unnest(extconfig) from pg_extension where extname='timescaledb') AND objid NOT IN (select unnest(extconfig) from pg_extension where extname='timescaledb')
ORDER BY objid::regclass::text COLLATE "C"; ORDER BY objid::regclass::text COLLATE "C";
objid objid
--------------------------------------------------- ---------------------------------------------------------
_timescaledb_cache.cache_inval_bgw_job _timescaledb_cache.cache_inval_bgw_job
_timescaledb_cache.cache_inval_extension _timescaledb_cache.cache_inval_extension
_timescaledb_cache.cache_inval_hypertable _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.hypertable_chunk_local_size
_timescaledb_internal.job_errors _timescaledb_internal.job_errors
timescaledb_experimental.policies timescaledb_experimental.policies
timescaledb_information.chunk_compression_settings
timescaledb_information.chunks timescaledb_information.chunks
timescaledb_information.compression_settings timescaledb_information.compression_settings
timescaledb_information.continuous_aggregates timescaledb_information.continuous_aggregates
timescaledb_information.dimensions timescaledb_information.dimensions
timescaledb_information.hypertable_compression_settings
timescaledb_information.hypertables timescaledb_information.hypertables
timescaledb_information.job_errors timescaledb_information.job_errors
timescaledb_information.job_stats timescaledb_information.job_stats
timescaledb_information.jobs 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 -- 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 \c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER

View File

@ -3,6 +3,8 @@
-- LICENSE-TIMESCALE for a copy of the license. -- LICENSE-TIMESCALE for a copy of the license.
\set ECHO ALL \set ECHO ALL
CREATE VIEW settings AS SELECT * FROM _timescaledb_catalog.compression_settings ORDER BY upper(relid::text) COLLATE "C"; 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); CREATE TABLE metrics(time timestamptz not null, device text, value float);
SELECT table_name FROM create_hypertable('metrics','time'); SELECT table_name FROM create_hypertable('metrics','time');
table_name table_name
@ -17,6 +19,17 @@ SELECT * FROM settings;
metrics | {device} | {time} | {t} | {t} metrics | {device} | {time} | {t} | {t}
(1 row) (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 -- create 2 chunks
INSERT INTO metrics VALUES ('2000-01-01'), ('2001-01-01'); INSERT INTO metrics VALUES ('2000-01-01'), ('2001-01-01');
-- no change to settings -- no change to settings
@ -36,13 +49,19 @@ INFO: compress_chunk_tuplesort_start
(1 row) (1 row)
RESET timescaledb.debug_compression_path_info; RESET timescaledb.debug_compression_path_info;
SELECT * FROM _timescaledb_catalog.compression_settings; SELECT * FROM settings;
relid | segmentby | orderby | orderby_desc | orderby_nullsfirst relid | segmentby | orderby | orderby_desc | orderby_nullsfirst
------------------------------------------------+-----------+---------+--------------+-------------------- ------------------------------------------------+-----------+---------+--------------+--------------------
metrics | {device} | {time} | {t} | {t} metrics | {device} | {time} | {t} | {t}
_timescaledb_internal.compress_hyper_2_3_chunk | {device} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_2_3_chunk | {device} | {time} | {t} | {t}
(2 rows) (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'); SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk');
compress_chunk compress_chunk
---------------------------------------- ----------------------------------------
@ -57,6 +76,13 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t}
(3 rows) (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 -- dropping chunk should remove that chunks compression settings
DROP TABLE _timescaledb_internal._hyper_1_1_chunk; DROP TABLE _timescaledb_internal._hyper_1_1_chunk;
SELECT * FROM settings; SELECT * FROM settings;
@ -66,6 +92,12 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_2_4_chunk | {device} | {time} | {t} | {t}
(2 rows) (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 -- decompress_chunk should remove settings for that chunk
SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk');
decompress_chunk decompress_chunk
@ -79,6 +111,11 @@ SELECT * FROM settings;
metrics | {device} | {time} | {t} | {t} metrics | {device} | {time} | {t} | {t}
(1 row) (1 row)
SELECT * FROM chunk_settings;
hypertable | chunk | segmentby | orderby
------------+-------+-----------+---------
(0 rows)
-- compress_chunk should add settings back -- compress_chunk should add settings back
SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk');
compress_chunk compress_chunk
@ -93,6 +130,12 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_2_5_chunk | {device} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_2_5_chunk | {device} | {time} | {t} | {t}
(2 rows) (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 -- dropping hypertable should remove all settings
DROP TABLE metrics; DROP TABLE metrics;
SELECT * FROM settings; SELECT * FROM settings;
@ -100,6 +143,16 @@ SELECT * FROM settings;
-------+-----------+---------+--------------+-------------------- -------+-----------+---------+--------------+--------------------
(0 rows) (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); CREATE TABLE metrics(time timestamptz not null, d1 text, d2 text, value float);
SELECT table_name FROM create_hypertable('metrics','time'); SELECT table_name FROM create_hypertable('metrics','time');
table_name table_name
@ -115,6 +168,12 @@ SELECT * FROM settings;
metrics | | {time} | {t} | {t} metrics | | {time} | {t} | {t}
(1 row) (1 row)
SELECT * FROM ht_settings;
hypertable | segmentby | orderby | compress_interval_length
------------+-----------+-------------+--------------------------
metrics | | "time" DESC |
(1 row)
-- create chunk -- create chunk
INSERT INTO metrics VALUES ('2000-01-01'); INSERT INTO metrics VALUES ('2000-01-01');
ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1');
@ -125,6 +184,12 @@ SELECT * FROM settings;
metrics | {d1} | {time} | {t} | {t} metrics | {d1} | {time} | {t} | {t}
(1 row) (1 row)
SELECT * FROM ht_settings;
hypertable | segmentby | orderby | compress_interval_length
------------+-----------+-------------+--------------------------
metrics | d1 | "time" DESC |
(1 row)
SELECT compress_chunk(show_chunks('metrics')); SELECT compress_chunk(show_chunks('metrics'));
compress_chunk compress_chunk
---------------------------------------- ----------------------------------------
@ -139,6 +204,12 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t}
(2 rows) (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 -- changing settings should update settings for hypertable but not existing compressed chunks
ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2');
SELECT * FROM settings; SELECT * FROM settings;
@ -148,6 +219,18 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t}
(2 rows) (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 -- changing settings should update settings for hypertable but not existing compressed chunks
ALTER TABLE metrics SET (timescaledb.compress_segmentby=''); ALTER TABLE metrics SET (timescaledb.compress_segmentby='');
SELECT * FROM settings; SELECT * FROM settings;
@ -157,6 +240,18 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t} _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t}
(2 rows) (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 -- create another chunk
INSERT INTO metrics VALUES ('2000-02-01'); INSERT INTO metrics VALUES ('2000-02-01');
SELECT compress_chunk(show_chunks('metrics'), true); SELECT compress_chunk(show_chunks('metrics'), true);
@ -175,23 +270,23 @@ SELECT * FROM settings;
_timescaledb_internal.compress_hyper_4_9_chunk | | {time} | {t} | {t} _timescaledb_internal.compress_hyper_4_9_chunk | | {time} | {t} | {t}
(3 rows) (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'); 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 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 -- recompressing chunks should apply current hypertable settings
SELECT decompress_chunk(:'CHUNK'); SELECT compress_chunk(:'CHUNK', recompress:=true);
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');
compress_chunk compress_chunk
---------------------------------------- ----------------------------------------
_timescaledb_internal._hyper_3_8_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} _timescaledb_internal.compress_hyper_4_7_chunk | {d1} | {time} | {t} | {t}
(3 rows) (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)

View File

@ -5,12 +5,16 @@
\set ECHO ALL \set ECHO ALL
CREATE VIEW settings AS SELECT * FROM _timescaledb_catalog.compression_settings ORDER BY upper(relid::text) COLLATE "C"; 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); CREATE TABLE metrics(time timestamptz not null, device text, value float);
SELECT table_name FROM create_hypertable('metrics','time'); SELECT table_name FROM create_hypertable('metrics','time');
ALTER TABLE metrics SET (timescaledb.compress, timescaledb.compress_segmentby='device'); ALTER TABLE metrics SET (timescaledb.compress, timescaledb.compress_segmentby='device');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT * FROM chunk_settings;
-- create 2 chunks -- create 2 chunks
INSERT INTO metrics VALUES ('2000-01-01'), ('2001-01-01'); 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'); SELECT compress_chunk('_timescaledb_internal._hyper_1_1_chunk');
RESET timescaledb.debug_compression_path_info; 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 compress_chunk('_timescaledb_internal._hyper_1_2_chunk');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM chunk_settings;
-- dropping chunk should remove that chunks compression settings -- dropping chunk should remove that chunks compression settings
DROP TABLE _timescaledb_internal._hyper_1_1_chunk; DROP TABLE _timescaledb_internal._hyper_1_1_chunk;
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM chunk_settings;
-- decompress_chunk should remove settings for that chunk -- decompress_chunk should remove settings for that chunk
SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT decompress_chunk('_timescaledb_internal._hyper_1_2_chunk');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM chunk_settings;
-- compress_chunk should add settings back -- compress_chunk should add settings back
SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk'); SELECT compress_chunk('_timescaledb_internal._hyper_1_2_chunk');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM chunk_settings;
-- dropping hypertable should remove all settings -- dropping hypertable should remove all settings
DROP TABLE metrics; DROP TABLE metrics;
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT * FROM chunk_settings;
CREATE TABLE metrics(time timestamptz not null, d1 text, d2 text, value float); CREATE TABLE metrics(time timestamptz not null, d1 text, d2 text, value float);
SELECT table_name FROM create_hypertable('metrics','time'); 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); ALTER TABLE metrics SET (timescaledb.compress);
-- hypertable should have default settings now -- hypertable should have default settings now
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
-- create chunk -- create chunk
INSERT INTO metrics VALUES ('2000-01-01'); INSERT INTO metrics VALUES ('2000-01-01');
ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d1');
-- settings should be updated -- settings should be updated
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT compress_chunk(show_chunks('metrics')); SELECT compress_chunk(show_chunks('metrics'));
-- settings for compressed chunk should be present -- settings for compressed chunk should be present
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM chunk_settings;
-- changing settings should update settings for hypertable but not existing compressed chunks -- changing settings should update settings for hypertable but not existing compressed chunks
ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT * FROM chunk_settings;
-- changing settings should update settings for hypertable but not existing compressed chunks -- changing settings should update settings for hypertable but not existing compressed chunks
ALTER TABLE metrics SET (timescaledb.compress_segmentby=''); ALTER TABLE metrics SET (timescaledb.compress_segmentby='');
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT * FROM chunk_settings;
-- create another chunk -- create another chunk
INSERT INTO metrics VALUES ('2000-02-01'); INSERT INTO metrics VALUES ('2000-02-01');
SELECT compress_chunk(show_chunks('metrics'), true); SELECT compress_chunk(show_chunks('metrics'), true);
SELECT * FROM settings; SELECT * FROM settings;
SELECT * FROM ht_settings;
SELECT * FROM chunk_settings;
ALTER TABLE metrics SET (timescaledb.compress_segmentby='d2'); 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 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 -- recompressing chunks should apply current hypertable settings
SELECT decompress_chunk(:'CHUNK'); SELECT compress_chunk(:'CHUNK', recompress:=true);
SELECT * FROM settings;
SELECT compress_chunk(:'CHUNK');
SELECT * FROM settings; 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;