創建普通數據表
create table agg_source(
id UInt8,
name String,
city String,
money UInt32
)engine=MergeTree()
partition by city
order by id;
插入數據
insert into agg_source values
(1, 'aa', 'SD', 200),
(2, 'bb', 'SD', 200),
(3, 'cc', 'SH', 200),
(4, 'dd', 'BJ', 200),
(5, 'ee', 'SZ', 200),
(6, 'ff', 'BJ', 100);
(7, 'gg', 'HZ', 100);
(8, 'ww', 'WH', 100);
執行查詢
select
city,
uniq(name) num,
sum(money) money
from agg_source
group by city;
創建該表的物化視圖,用來聚合每個城市的 money 和 人數
create materialized view agg_view
engine = AggregatingMergeTree()
partition by city
order by city
populate
as
select
city,
uniqState(name) name,
sumState(money) money
from agg_source
group by city;
執行查詢
select
city,
uniqMerge(name),
sumMerge(money)
from agg_view
group by city;
populate 表示實時同步源表數據的變化,會影響性能。如果不加,則會在合並分區或者手動執行 optimeize table 的時候更新視圖中的數據。
總結
物化視圖可以理解為預計算,聚合函數的值提前在物化視圖中已經計算好了,查詢的時候就直接拿值就好了,提高了查詢的速度,當然物化視圖也占用本地磁盤空間,相當於空間換時間,並且源表數據變化物化視圖也會跟着修改,所以要盡可能減少修改操作。
