mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 10:11:29 +08:00
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:
parent
fa5c0a9b22
commit
ea6d826c12
1
.unreleased/pr_6630
Normal file
1
.unreleased/pr_6630
Normal file
@ -0,0 +1 @@
|
||||
Implements: #6630 Add views for per chunk compression settings
|
@ -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;
|
||||
|
||||
|
@ -0,0 +1,4 @@
|
||||
|
||||
DROP VIEW IF EXISTS timescaledb_information.hypertable_compression_settings;
|
||||
DROP VIEW IF EXISTS timescaledb_information.chunk_compression_settings;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user