mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 18:13:18 +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[]);
|
||||||
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;
|
||||||
|
|
||||||
|
@ -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_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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user