timescaledb/tsl/test/sql/cagg_drop_chunks.sql
Fabrízio de Royes Mello 32a695e18f Make CAggs materialized only by default
Historically creating a Continuous Aggregate make it realtime by default
but it confuse users specially when using `WITH NO DATA` option. Also is
well known that realtime Continuous Aggregates can potentially lead to
issues with Hierarchical and Data Tiering.

Improved the UX by making Continuous Aggregates non-realtime by default.
2023-09-26 15:53:26 -03:00

128 lines
4.1 KiB
PL/PgSQL

-- This file and its contents are licensed under the Timescale License.
-- Please see the included NOTICE for copyright information and
-- LICENSE-TIMESCALE for a copy of the license.
\c :TEST_DBNAME :ROLE_SUPERUSER
--
-- Check that drop chunks with a unique constraint works as expected.
--
CREATE TABLE clients (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
UNIQUE(name)
);
CREATE TABLE records (
time TIMESTAMPTZ NOT NULL,
clientId INT NOT NULL REFERENCES clients(id),
value DOUBLE PRECISION,
UNIQUE(time, clientId)
);
SELECT * FROM create_hypertable('records', 'time',
chunk_time_interval => INTERVAL '1h');
CREATE MATERIALIZED VIEW records_monthly
WITH (timescaledb.continuous, timescaledb.materialized_only=false)
AS
SELECT time_bucket('1d', time) as bucket,
clientId,
avg(value) as value_avg,
max(value)-min(value) as value_spread
FROM records GROUP BY bucket, clientId WITH NO DATA;
INSERT INTO clients(name) VALUES ('test-client');
INSERT INTO records
SELECT generate_series('2000-03-01'::timestamptz,'2000-04-01','1 day'),1,3.14;
SELECT * FROM records_monthly;
SELECT chunk_name, range_start, range_end
FROM timescaledb_information.chunks
WHERE hypertable_name = 'records_monthly' ORDER BY range_start;
SELECT chunk_name, range_start, range_end
FROM timescaledb_information.chunks
WHERE hypertable_name = 'records' ORDER BY range_start;
CALL refresh_continuous_aggregate('records_monthly', NULL, NULL);
\set VERBOSITY default
SELECT drop_chunks('records', '2000-03-16'::timestamptz);
\set VERBOSITY terse
DROP MATERIALIZED VIEW records_monthly;
DROP TABLE records;
DROP TABLE clients;
\set VERBOSITY default
CREATE PROCEDURE refresh_cagg_by_chunk_range(_cagg REGCLASS, _hypertable REGCLASS, _older_than INTEGER)
AS
$$
DECLARE
_r RECORD;
BEGIN
WITH _chunks AS (
SELECT relname, nspname
FROM show_chunks(_hypertable, _older_than) AS relid
JOIN pg_catalog.pg_class ON pg_class.oid = relid AND pg_class.relkind = 'r'
JOIN pg_catalog.pg_namespace ON pg_namespace.oid = pg_class.relnamespace
)
SELECT MIN(range_start) AS range_start, MAX(range_end) AS range_end
INTO _r
FROM
_chunks
JOIN _timescaledb_catalog.chunk ON chunk.schema_name = _chunks.nspname AND chunk.table_name = _chunks.relname
JOIN _timescaledb_catalog.chunk_constraint ON chunk_id = chunk.id
JOIN _timescaledb_catalog.dimension_slice ON dimension_slice.id = dimension_slice_id;
RAISE INFO 'range_start=% range_end=%', _r.range_start::int, _r.range_end::int;
CALL refresh_continuous_aggregate(_cagg, _r.range_start::int, _r.range_end::int + 1);
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION test_int_now() returns INT LANGUAGE SQL STABLE as
$$ SELECT 125 $$;
CREATE TABLE conditions(time_int INT NOT NULL, value FLOAT);
SELECT create_hypertable('conditions', 'time_int', chunk_time_interval => 4);
INSERT INTO conditions
SELECT time_val, 1 FROM generate_series(0, 19, 1) AS time_val;
SELECT set_integer_now_func('conditions', 'test_int_now');
CREATE MATERIALIZED VIEW conditions_2
WITH (timescaledb.continuous, timescaledb.materialized_only = TRUE)
AS
SELECT time_bucket(2, time_int) as bucket,
SUM(value), COUNT(value)
FROM conditions GROUP BY bucket WITH DATA;
SELECT * FROM conditions_2 ORDER BY bucket;
UPDATE conditions SET value = 4.00 WHERE time_int = 0;
UPDATE conditions SET value = 4.00 WHERE time_int = 6;
CALL refresh_cagg_by_chunk_range('conditions_2', 'conditions', 4);
SELECT drop_chunks('conditions', 4);
SELECT * FROM conditions_2 ORDER BY bucket;
CALL refresh_cagg_by_chunk_range('conditions_2', 'conditions', 8);
SELECT * FROM conditions_2 ORDER BY bucket;
UPDATE conditions SET value = 4.00 WHERE time_int = 19;
SELECT drop_chunks('conditions', 8);
CALL refresh_cagg_by_chunk_range('conditions_2', 'conditions', 12);
SELECT * FROM conditions_2 ORDER BY bucket;
CALL refresh_cagg_by_chunk_range('conditions_2', 'conditions', NULL);
SELECT * FROM conditions_2 ORDER BY bucket;
DROP PROCEDURE refresh_cagg_by_chunk_range(REGCLASS, REGCLASS, INTEGER);