我需要创建一个表来存储其他两个表过去 180 天的事件和一些聚合。
我认为物化视图可以完美地工作,但似乎我遇到了一些限制:
我想删除超过 180 天的事件并仅添加过去一天的事件,因为查询过去 180 天的数据每次运行都会处理 15-16 TB。
我的计划是创建一个视图:
CREATE VIEW test_view AS
SELECT
colA,
colB,
date_column,
count(*)
FROM table a
WHERE date_column >= current_date - 180
GROUP BY colA,
colB,
date_column
UNION ALL
SELECT
colA,
colB,
date_column,
count(*)
FROM table b
WHERE date_column >= current_date - 180
GROUP BY colA,
colB,
date_column
然后将其用于具有相同结构的表“test_table”。
这个计划能成功吗:
DELETE * FROM test_table
WHERE date_column < current_date - 180;
INSERT INTO test_table
SELECT * FROM test_view
WHERE date_column = current_date - 1;
或者这样视图将查询所有 180 天,一切都将毫无意义?
删除超过 180 天的所有数据,然后插入最新一天的数据会产生大量数据移动,并且可能会很慢。因此,尝试创建一个专用表 test_table 来存储聚合数据,然后安排每天运行的作业,而不是视图:
DELETE FROM test_table WHERE date_column < current_date - 180
不用在视图中查询所有 180 天,而是直接从基表中插入过去一天的数据:
INSERT INTO test_table (colA, colB, date_column, count)
SELECT colA, colB, date_column, count(*)
FROM table_a
WHERE date_column = current_date - 1
GROUP BY colA, colB, date_column
UNION ALL
SELECT colA, colB, date_column, count(*)
FROM table_b
WHERE date_column = current_date - 1
GROUP BY colA, colB, date_column;