CarbonData物化视图简介

举报
笨熊爱喝cola 发表于 2020/12/02 23:34:40 2020/12/02
【摘要】 CarbonData中的物化视图的简单介绍及使用方法

1.视图

视图表 (View) 是在关系数据库中,将一组查询指令构成的结果集,组合成可查询的资料表的一种数据库对象。与数据表不同的是,数据表是一种实体结构(Physical Structure),但视图表是一种虚拟结构(Virtual Structure),在实体数据表中的改变都可以立刻反映在视图表中,不过部分数据库管理系统也支持具更新能力的视图表(Updatable View)视图表具有下列的好处:
可以将实体表隐藏起来,让外部程序的设计师无法得知实际的数据结构,降低数据库被攻击的风险。
在多数的情况下,视图表是只读的(只可以select),外部程序无法直接透过视图表修改数据(具更新能力的视图表除外)
简化查询,数据库管理员可以将高度复杂的查询,包装在视图表中,外部程序只需要直接访问该视图表即可取出需要的资料。
在视图表中先行运行运算。
视图表可视为数据表,具有 JOIN 的能力。
数据库中只需要存储定义,无须存储数据
视图与表的区别
视图是已经编译好的sql语句,而表不是 
视图没有实际的物理记录,而表有;表是内容,视图是窗口
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表;视图的建立和删除只影响视图本身,不影响对应的基本表。

视图表由于是数据库对象之一,因此需要使用SQL创建,修改与删除,例如下列的指令
// 创建一个视图表
CREATE VIEW myView AS SELECT * FROM myTable

// 而外部程序可以用下列指令来访问视图表
SELECT * FROM myView WHERE myID = 3982

// 若要删除视图表,则可以用删除
DROP VIEW myView

2.CarbonData物化视图

物化视图是包括一个查询结果的数据库对象,它可以是远程数据的本地副本,也可以是用来生成基于数据表求和的汇总表。物化视图的更新有两种模式on commiton manual。当我们创建出MV之后,会调用MVRewriteRule帮助我们重写逻辑计划,并且使得查询操作依赖MV,查询更加高效。
if (viewCatalog != null && hasSuitableMV(logicalPlan, viewCatalog)) {
      val viewRewrite = new MVRewrite(viewCatalog, logicalPlan, session)
      val rewrittenPlan = viewRewrite.rewrittenPlan
      if (rewrittenPlan.find(_.rewritten).isDefined) {
        session.sql(rewriteFunctionWithQualifierName(rewrittenPlan)).queryExecution.analyzed
      } else {
        logicalPlan
      }
    } else {
      logicalPlan
}
存储方式:占用一定存储空间,但是查询效率更快
读取方式:物化视图会预先保留一些信息,可以直接读取,不必执行查询语句调用原表
Note
在创建MV的时候要向映射列表提供groupbyorderby的列
若从一张表上生成MV,会继承物理表的properties
不可从一张表中映射所有列(SELECT * FROM x
可以提供与物理表不同的参数
建表时不允许使用limit or union
MV不支持流化

3.CarbonData物化视图使用

(1)视图创建:物化视图的创建,在创建使用关键字CREATE MATERIALIZED VIEW
spark.sql ( """create materialized view agg_sales properties('TABLE_BLOCKSIZE'='256MB','LOCAL_DICTIONARY_ENABLE'='false')
| as select country, sex, sum(quantity), avg(price) from sales groupby country, sex""")
(2)loading data,导入数据拥有两种数据更新模式
on commit:增量数据在入到数据表中时,会触发更新MV的操作,更新表内容
on manual:当我们的数据与数据表不同时,我们可以调用命令手动对表进行同步
 REFRESH MATERIALIZED VIEW agg_sales
(3)查询数据

根据下面SQL中生成的物化视图

CREATE MATERIALIZED VIEW agg_sales
PROPERTIES('TABLE_BLOCKSIZE'='256 MB','LOCAL_DICTIONARY_ENABLE'='false')
AS
    SELECT country, sex, sum(quantity), avg(price)
    FROM sales
    GROUP BY country, sex

以下的查询操作将被优化:

  SELECT country, sex, sum(quantity), avg(price) FROM sales GROUP BY country, sex

  SELECT sex, sum(quantity) FROM sales GROUP BY sex

  SELECT avg(price), country FROM sales GROUP BY country

这些查询操作将会被CarbonData‘s query planner转化为查询MV获得结果,不需要从实际表中查询数据

下面的这些操作只能从实际表中查询

  SELECT user_id, country, sex, sum(quantity), avg(price) FROM sales GROUP BY user_id, country, sex

  SELECT sex, avg(quantity) FROM sales GROUP BY sex

  SELECT country, max(price) FROM sales GROUP BY country
(4)数据管理
DELETE SEGMENT,不可在创建视图之后对原始表使用
部分修改表格式的命令不可再使用,如ALTER TABLE DROP COLUMN, ALTER TABLE CHANGE DATATYPE, ALTER TABLE RENAME, ALTER COLUMN RENAME。增加新列的命令依旧可使用,去除列或者改变数据类型则会视是否影响物化视图而选择使用
ALTER TABLE ADD/DROP PARTITION,如果一个MV与多个表相关联,则不能进行分区操作。只有一个物理表对应一个MV才可以进行分区操作。不允许在MV上删除分区
不可再MV中使用复杂数据类型
Carbon拥有自己内建的时间序列UDF,可以在生成MV的时候使用时间类型

4.总结

在CarbonData中合理的生成物化视图可以加快数据的查询,但是过度的生成物化视图会占用过多的存储空间。因此如何合理的建立物化视图是能够更好使用物化视图的关键及可以优化物化视图的关键点。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。