mirror of https://github.com/citusdata/citus.git
410 lines
8.2 KiB
SQL
410 lines
8.2 KiB
SQL
--
|
|
-- CIMV
|
|
-- Tests for Citus Incremental Materialized Views
|
|
--
|
|
|
|
\set VERBOSITY terse
|
|
SET citus.next_shard_id TO 400000;
|
|
CREATE SCHEMA cimv;
|
|
SET search_path TO cimv, public;
|
|
|
|
SET citus.shard_count TO 4;
|
|
|
|
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
|
|
|
|
INSERT INTO events
|
|
SELECT v % 10 AS a,
|
|
v % 100 AS b,
|
|
v / 3.0 AS c,
|
|
timestamp '2020-01-01 20:00:00' +
|
|
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
|
|
timestamp '2020-01-01 10:00:00')) AS d,
|
|
v AS e
|
|
FROM generate_series(1, 10000) v;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
min(b) AS min_b,
|
|
max(b) AS max_b,
|
|
avg(b) AS avg_b,
|
|
min(c) AS min_c,
|
|
max(c) AS max_c,
|
|
avg(c) AS avg_c,
|
|
min(e) AS min_e,
|
|
max(e) AS max_e,
|
|
avg(e) AS avg_e
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
min_b::numeric(12,2),
|
|
max_b::numeric(12,2),
|
|
avg_b::numeric(12,2),
|
|
min_c::numeric(12,2),
|
|
max_c::numeric(12,2),
|
|
avg_c::numeric(12,2),
|
|
min_e::numeric(12,2),
|
|
max_e::numeric(12,2),
|
|
avg_e::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
INSERT INTO events
|
|
SELECT v % 10 AS a,
|
|
v % 100 AS b,
|
|
v / 3.0 AS c,
|
|
timestamp '2020-01-01 20:00:00' +
|
|
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
|
|
timestamp '2020-01-01 10:00:00')) AS d,
|
|
v AS e
|
|
FROM generate_series(10000, 11000) v;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
min_b::numeric(12,2),
|
|
max_b::numeric(12,2),
|
|
avg_b::numeric(12,2),
|
|
min_c::numeric(12,2),
|
|
max_c::numeric(12,2),
|
|
avg_c::numeric(12,2),
|
|
min_e::numeric(12,2),
|
|
max_e::numeric(12,2),
|
|
avg_e::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 100;
|
|
|
|
DROP VIEW mv;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 20;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
UPDATE events SET b = b + b;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
|
|
INSERT INTO events
|
|
SELECT v % 10 AS a,
|
|
v % 100 AS b,
|
|
v / 3.0 AS c,
|
|
timestamp '2020-01-01 20:00:00' +
|
|
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
|
|
timestamp '2020-01-01 10:00:00')) AS d,
|
|
v AS e
|
|
FROM generate_series(11000, 12000) v;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 100;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
UPDATE events SET b = b + b;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
REFRESH MATERIALIZED VIEW mv WITH NO DATA;
|
|
|
|
SELECT * FROM mv;
|
|
|
|
REFRESH MATERIALIZED VIEW mv;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour WITH NO DATA;
|
|
|
|
SELECT * FROM mv;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
SELECT create_distributed_table('events', 'a');
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
min(b) AS min_b,
|
|
max(b) AS max_b,
|
|
avg(b) AS avg_b,
|
|
min(c) AS min_c,
|
|
max(c) AS max_c,
|
|
avg(c) AS avg_c,
|
|
min(e) AS min_e,
|
|
max(e) AS max_e,
|
|
avg(e) AS avg_e
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
min_b::numeric(12,2),
|
|
max_b::numeric(12,2),
|
|
avg_b::numeric(12,2),
|
|
min_c::numeric(12,2),
|
|
max_c::numeric(12,2),
|
|
avg_c::numeric(12,2),
|
|
min_e::numeric(12,2),
|
|
max_e::numeric(12,2),
|
|
avg_e::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
INSERT INTO events
|
|
SELECT v % 10 AS a,
|
|
v % 100 AS b,
|
|
v / 3.0 AS c,
|
|
timestamp '2020-01-01 20:00:00' +
|
|
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
|
|
timestamp '2020-01-01 10:00:00')) AS d,
|
|
v AS e
|
|
FROM generate_series(12000, 13000) v;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
min_b::numeric(12,2),
|
|
max_b::numeric(12,2),
|
|
avg_b::numeric(12,2),
|
|
min_c::numeric(12,2),
|
|
max_c::numeric(12,2),
|
|
avg_c::numeric(12,2),
|
|
min_e::numeric(12,2),
|
|
max_e::numeric(12,2),
|
|
avg_e::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 100;
|
|
|
|
DROP VIEW mv;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 20;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
|
|
UPDATE events SET b = b + b;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
INSERT INTO events
|
|
SELECT v % 10 AS a,
|
|
v % 100 AS b,
|
|
v / 3.0 AS c,
|
|
timestamp '2020-01-01 20:00:00' +
|
|
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
|
|
timestamp '2020-01-01 10:00:00')) AS d,
|
|
v AS e
|
|
FROM generate_series(13000, 14000) v;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DELETE FROM events WHERE b < 100;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
UPDATE events SET b = b + b;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
REFRESH MATERIALIZED VIEW mv WITH NO DATA;
|
|
|
|
SELECT * FROM mv;
|
|
|
|
REFRESH MATERIALIZED VIEW mv;
|
|
|
|
SELECT a,
|
|
d_hour,
|
|
avg_b::numeric(12,2)
|
|
FROM mv
|
|
ORDER BY a, d_hour;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
avg(b) AS avg_b
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour WITH NO DATA;
|
|
|
|
SELECT * FROM mv;
|
|
|
|
-- make sure same mv can be created in different schemas without overlap
|
|
CREATE SCHEMA another_schema;
|
|
SET search_path to another_schema;
|
|
SET citus.shard_count TO 4;
|
|
|
|
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
min(b) AS min_b,
|
|
max(b) AS max_b,
|
|
avg(b) AS avg_b,
|
|
min(c) AS min_c,
|
|
max(c) AS max_c,
|
|
avg(c) AS avg_c,
|
|
min(e) AS min_e,
|
|
max(e) AS max_e,
|
|
avg(e) AS avg_e
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
DROP MATERIALIZED VIEW mv;
|
|
|
|
-- test that another user can create CIMV as well
|
|
CREATE USER new_user;
|
|
CREATE SCHEMA another_schema2;
|
|
SET search_path to another_schema2;
|
|
|
|
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
|
|
|
|
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
|
|
SELECT a,
|
|
date_trunc('hour', d) AS d_hour,
|
|
min(b) AS min_b,
|
|
max(b) AS max_b,
|
|
avg(b) AS avg_b,
|
|
min(c) AS min_c,
|
|
max(c) AS max_c,
|
|
avg(c) AS avg_c,
|
|
min(e) AS min_e,
|
|
max(e) AS max_e,
|
|
avg(e) AS avg_e
|
|
FROM events
|
|
WHERE b > 10
|
|
GROUP BY a, d_hour;
|
|
|
|
REFRESH MATERIALIZED VIEW mv;
|
|
DROP MATERIALIZED VIEW mv CASCADE;
|
|
|
|
SET client_min_messages TO WARNING; -- suppress cascade messages
|
|
DROP SCHEMA cimv CASCADE;
|