• Clickhouse物化视图


    一、概念

    clickhouse的物化视图是一种查询结果的持久化,给我们带来了查询效率的提升。用户查询效果和查表没有区别,其本质就是一张表,一张时刻在预计算的表,创建的过程用了一个特殊引擎:

    注:使用create语法,会创建一个隐藏的目标来保存视图数据,使用To表名,保存到一张显示的表,没有加To表名,表名默认就是.inner.物化视图名,

    CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT …

    “查询结果集”的范围很广泛,可以是基础表中部分数据的一份简单拷贝,也可以是多表join之后产生的结果或其子集、或者原始数据的聚合指标等等。所以,物化视图不会随着基础表的变化而变化,所以也称为快照

    创建物化视图的限制

    1、必须指定物化视图的engine用于数据存储

    2、使用To[db].[table]语法时,不得使用POPULATE,POPULATE会将历史数据全都加载转换过来,数据量大时存在一个不可用时间(官方并不推荐在创建物化视图的时候使用POPULATE,因为在创建物化视图过程中同时写入的数据不能被插入物化视图)

    3、查询语句(select)可以包含下面的句子:DISTINCT、GROUP BY、LIMIT等

    4、若物化视图的定义使用了 TO [db.]name 子语句,则可以将目标表的视图卸载DETACH 再装载 ATTACH

    物化视图和普通视图的区别:

    普通视图不保存数据,保存的仅仅是查询语句,查询的时候还是从原表中读取数据,可以将普通视图理解为是个子查询。

    物化视图则是 把查询的结果根据相应的引擎存入到磁盘或者内存中,对数据重新进行了组织,生成了一张新表

    优缺点:

    优点:查询速度快,提前将物化视图规则写好,比直接查询原数据了很多 (物化视图起到了一个同步的作用)

    缺点:本质是流式数据 的使用场景,采用累加式的技术,要用到历史数据做去重、去核这样的分析。使用场景有限,如果一张表加了很多物化视图,在写这张表的时候会消耗很多及其的资源,比如数据带宽占满,存储量突增

    1. #创建表
    2. CREATE TABLE `ts_area_info` (
    3. id UInt32 ,
    4. createDate Date ,
    5. userId UInt32 ,
    6. url String,
    7. income UInt8
    8. ) ENGINE=MergeTree()
    9. PARTITION BY toYYYYMM(createDate)
    10. ORDER BY (id,createDate,intHash32(userId))
    11. SAMPLE BY intHash32(userId)
    12. SETTINGS index_granularity = 8192
    13. #创建物化视图
    14. CREATE MATERIALIZED VIEW area_mv
    15. ENGINE SummingMergeTree
    16. PARTITION BY toYYYYMM(createDate)
    17. ORDER BY (id,createDate,intHash32(userId))
    18. AS
    19. select * from ts_area_info;

     新生成的物化视图:

     关键字段:

    populate:建表同步数据

    final:去最新的数据

    二、物化视图作为聚合表

    同步数据的时候实现聚合

    1. #使用物化视图同步聚合表
    2. 1、创建明细表
    3. drop table tb_order;
    4. create table tb_order(
    5. id UInt8 ,
    6. createDate Date ,
    7. money UInt64
    8. )
    9. ENGINE =MergeTree()
    10. order by id;
    11. 2、插入数据
    12. insert into tb_order values(1,toDate(now()),100),
    13. (2,toDate(now()),100),
    14. (3,toDate(now()),100),
    15. (1,toDate(now()),100),
    16. (2,toDate(now()),200),
    17. (3,toDate(now()),300);
    18. 3、创建物化视图同步数据
    19. CREATE MATERIALIZED VIEW order_mv
    20. ENGINE AggregatingMergeTree()
    21. PARTITION BY toYYYYMM(createDate)
    22. ORDER BY (id,createDate)
    23. POPULATE AS
    24. select id,createDate,sumState(money) as ms from tb_order
    25. GROUP BY id,createDate;
    26. 4、查询物化视图
    27. select id,createDate,sumMerge(ms) from order_mv GROUP BY id,createDate;
    28. 5、重新插入查看同步数据
    29. insert into tb_order values(1,toDate(now()),100),(2,toDate(now()),100);
    30. insert into tb_order values(1,toDate('2022-06-29'),100),(2,toDate('2022-06-29'),100);
    31. 6、查询订单表
    32. select * from tb_order;

    注:

    在建表时没有指定主键,会默认使用order by的字段作为主键

  • 相关阅读:
    【云原生之kubernetes实战】在k8s环境下部署flatnotes笔记工具
    【第十四篇】- Maven 自动化构建
    PythonNotes_Basic1
    linux网络常用命令
    vue实现爱心形状的复选框
    《深入浅出.NET框架设计与实现》阅读笔记(一)
    数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(5)
    springboot一个简单的前端响应后端查询项目
    IntelliJ IDEA运行JAVA
    大模型产业化有四个关键,昇腾AI推动“AI+遥感”打了个样
  • 原文地址:https://blog.csdn.net/qq_39243221/article/details/125522615