Apache Doris (二十一) :Doris Rollup物化索引创建与操作

news2024/11/14 20:28:09

目录

1. 创建测试表

2. 创建Rollup物化索引表

 3. 查看Rollup物化索引表 

4. 删除Rollup物化索引表

5. 验证Rollup物化索引使用


进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容!

宝子们点赞、收藏不迷路!抓紧订阅专题!


ROLLUP 在多维分析中是“上卷”的意思,即将数据按某种指定的粒度进行进一步聚合。在 Doris 中,我们将用户通过建表语句创建出来的表称为 Base 表(Base Table)。Base 表中保存着按用户建表语句指定的方式存储的基础数据。

Rollup 可以理解为Base Table 的一个物化索引结构,“物化”是因为其数据在物理上独立存储,而“索引”的意思是,建立 Rollup 时可只选取 Base Table 中的部分列作为 Schema,Schema 中的字段顺序也可与 Base Table 不同,所以Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。

在 Base 表之上,我们可以创建任意多个 ROLLUP 物化索引表,这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。ROLLUP 物化索引表的基本作用,在于在 Base 表的基础上,获得更粗粒度的聚合数据。

1. 创建测试表

创建表 tbl1,建表SQL语句如下:

CREATE TABLE IF NOT EXISTS example_db.tbl1
(
`siteid` BIGINT NOT NULL COMMENT "网站id",
`citycode` SMALLINT NOT NULL COMMENT "城市编码",
`username` VARCHAR(32) NOT NULL COMMENT "用户名称",
`pv` BIGINT SUM NOT NULL DEFAULT "0" COMMENT "pv值",
`uv` BIGINT SUM NOT NULL DEFAULT "0" COMMENT "uv值"
)
AGGREGATE KEY(`siteid`, `citycode`, `username`)
DISTRIBUTED BY HASH(`siteid`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

并向表中插入如下20条数据:

insert into example_db.tbl1 values 
(101,1,"陈家伟",20,10),
(102,2,"童启光",21,11),
(103,1,"丁俊毅",22,12),
(104,2,"林正平",23,13),
(105,1,"王雅云",24,14),
(101,2,"陈家伟",25,15),
(102,1,"童启光",26,16),
(103,2,"丁俊毅",27,17),
(104,1,"林正平",28,18),
(105,2,"王雅云",29,19),
(101,1,"陈家伟",30,20),
(102,2,"童启光",31,21),
(103,1,"丁俊毅",32,22),
(104,2,"林正平",33,23),
(105,1,"王雅云",34,24),
(101,2,"陈家伟",35,25),
(102,1,"童启光",36,26),
(103,2,"丁俊毅",37,27),
(104,1,"林正平",38,28),
(105,2,"王雅云",39,29);

表中数据如下:

 

对于 tbl1明细数据是 siteid, citycode, username 三者构成一组 key,从而对 pv 、uv字段进行聚合;如果业务方经常有看城市 pv 总量的需求,可以建立一个只有 citycode, pv 的rollup,这就可以通过创建Rollup物化索引表来实现。

2. 创建Rollup物化索引表

基于Base表创建Rollup物化索引表语法如下:

ALTER TABLE [database.]table ADD ROLLUP rollup_name (column_name1, column_name2, ...)

对tbl1表创建只有citycode,pv两列的Rollup物化索引表,指定rollup_name为rollup_city,SQL如下:

mysql> ALTER TABLE tbl1 ADD ROLLUP rollup_city(citycode, pv);
Query OK, 0 rows affected (0.03 sec)

创建Rollup物化索引表过程是一个异步命令,SQL执行完成并不意味着Rollup表创建完成,创建的Rollup物化索引表rollup_city中只有citycode、pv两列,可以通过以下SQL来查询Rollup表作业的进度:

mysql> SHOW ALTER TABLE ROLLUP\G;
*************************** 1. row ***************************
             JobId: 18389
      TableName: tbl1
     CreateTime: 2023-02-09 21:14:57
     FinishTime: 2023-02-09 21:15:19
  BaseIndexName: tbl1
RollupIndexName: rollup_city
       RollupId: 18390
  TransactionId: 4016
          State: FINISHED
            Msg: 
       Progress: NULL
        Timeout: 2592000
1 rows in set (0.01 sec)

当作业状态为 FINISHED,则表示作业完成。也可以执行如下命令取消正在执行的作业:

CANCEL ALTER TABLE ROLLUP FROM table1;

 3. 查看Rollup物化索引表 

Rollup物化索引表创建完成后使用如下命令查看表的Rollup信息:

DESC [database.]table ALL

查看表tbl1的rollup物化索引信息:

4. 删除Rollup物化索引表

删除Rollup物化索引表命令如下:

ALTER TABLE [database.]table DROP ROLLUP rollup_name;

执行如下SQL删除tbl1上名为rollup_city的rollup物化索引表:

5. 验证Rollup物化索引使用

Rollup 建立之后,查询不需要指定 Rollup 进行查询,还是指定原有表进行查询即可。程序会自动判断是否应该使用 Rollup。是否命中 Rollup可以通过 EXPLAIN your_sql; 命令进行查看,查看执行该命令最后“VOlapScanNode”部分查询的TABLE即可。

下面我们对表执行如下SQL语句,查看explain信息:

mysql> explain select citycode ,sum(pv) from tbl1 group by citycode;
...
|   0:VOlapScanNode                                                           |
|      TABLE: default_cluster:example_db.tbl1(tbl1), PREAGGREGATION: ON       |
|      partitions=1/1, tablets=10/10, tabletList=18368,18370,18372 ...        |
|      cardinality=5, avgRowSize=2490.0, numNodes=3    
...

 我们可以看到由于删除了rollup物化索引表,所以无法从rollup物化索引表中进行查询,下面我们重新基于tbl1创建Rollup物化索引表rollup_city:

mysql> ALTER TABLE tbl1 ADD ROLLUP rollup_city(citycode, pv);
Query OK, 0 rows affected (0.03 sec)

#查看是否创建完成
mysql> SHOW ALTER TABLE ROLLUP\G;

当Rollup物化索引表创建完成后,重新执行explain SQL,我们发现命中了创建的Rollup物化索引表。

mysql> explain select citycode ,sum(pv) from tbl1 group by citycode;
...
|   0:VOlapScanNode                                                           
|
|TABLE: default_cluster:example_db.tbl1(rollup_city), PREAGGREGATION: ON |
|      partitions=1/1, tablets=10/10, tabletList=19029,19031,19033 ...         |
|      cardinality=5, avgRowSize=0.0, numNodes=3      
...

 通过“select citycode ,sum(pv) from tbl1 group by citycode”SQL查询可以看到Doris会自动命中Rollup物化索引表,从而只需要扫描极少的数据量,即可完成聚合查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

open3d 通过vscode+ssh连接远程服务器将可视化界面本地显示

当使用远程服务器时,我们希望能像在本地一样写完代码后能立刻出现一些gui窗口。但是目前网络上的资料都不能很好的解决这个问题。本文尝试尽可能简短地解决这个问题。 步骤 1、在服务器上安装open3d 已经非常简化了,可以使用一行代码完成 pip3 insta…

【Java从入门到大牛】方法详解

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Java从入门到大牛 🌠 首发时间:2023年7月9日 🦋 欢迎关注🖱点赞👍收藏🌟留言&#x1f43e…

【计算机组成与体系结构Ⅰ】实验7 IP核的使用、D触发器

一、实验目的 1:学会设计用IP核和原理图的方式设计电路,完成涉及1位数据的2选1多路选择器。 2:设计带异步置零和写使能端的D触发器。 二、实验环境 软件:Vivado 2015.4操作系统:Windows 10 三、实验内容 2.2.1 多路…

49天精通Java,第38天,类加载器,双亲委派机制

目录 一、类加载器子系统的作用1、加载2、链接3、初始化 二、验证【虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁】的代码实例三、类加载器的分类1、启动类加载器&#xff08;引导类加载器&#xff09;2、扩展类加载器3、应用程序类加载器&#xff08;系统…

字典dict的get和setdefault,以及collections的defaultdict

一&#xff1a;dict的get和setdefault 首先&#xff0c;字典dict的get和setdefault的用法都是xxx(key, value)&#xff0c; 都是在字典中查找指定的键并返回值&#xff0c;当查找的key键在字典中存在时&#xff0c;两者作用相同。 参考&#xff1a;https://blog.csdn.net/any1…

「深度学习之优化算法」(十)烟花算法

1. 烟花算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   烟花算法(Firework Algorithm,FWA)是一种受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法。算法的思想简单,但具体实现复杂。算法提出时间并不长,但是已经有了不少的改进研究和较为全…

【动手学习深度学习--逐行代码解析合集】11实战Kaggle比赛:预测房价

【动手学习深度学习】逐行代码解析合集 11实战Kaggle比赛&#xff1a;预测房价 视频链接&#xff1a;动手学习深度学习–实战Kaggle比赛&#xff1a;预测房价 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、下载和缓存数据集 …

【JavaEE初阶】JavaScript(WebAPI)

文章目录 1.WebAPI背景知识1.1什么是WebAPI1.2什么是API 2.DOM基本概念2.1什么是DOM2.2常用的DOMAPI2.2.1.选中页面元素2.2.2操作元素的属性1. 事件概念2.获取/修改元素内容3. 获取/修改元素属性4.获取/修改表单元素属性5.获取修改样式属性 2.2.3.操作页面节点1.新增节点2.删除…

关联数组不是线性表

百度百科给的关联数组的解释是&#xff1a; “关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它&#xff0c;还可以使用字符串或者其他类型的值&#xff08;除了NULL&#xff09;来索引它。 关联数组类似于哈希表&#xff0c;有键-索引&#xff0c;它包含标量…

nunittest如何生成测试报告?我来告诉你

目录 HTMLTestRunner 小试牛刀 1、在unittest中编写测试用例 2、添加报告路径已经报告内容 3、批量执行用例&#xff0c;导入测试报告内容中 4、当然是赶快执行查看报告内容啊 4、添加用例注释&#xff0c;增加报告完整性 总结&#xff1a; 我们做测试的人员们都知道测…

【mysql】—— 数据库基础

序言&#xff1a; 在上期&#xff0c;我们已经安装好了【mysql】。在本期&#xff0c;我将给大家介绍关于数据库的基本知识。 目录 &#xff08;一&#xff09;登陆选项 &#xff08;二&#xff09;基本介绍 1、什么是数据库 2、主流数据库 3、见一见数据库 4、服务器管…

使用matplotlib画图时,建立双坐标轴

在进行数据的可视化分析时&#xff0c;可能我们分析的两个指标&#xff0c;他们的取值区间相差很大&#xff0c;如果采用一个y轴&#xff0c;就不利于我们观察另一个指标。所以&#xff0c;记录一下我在项目的处理过程中采用的方法&#xff1a; 首先观察一下&#xff0c;我用到…

MAYA粒子碰撞颜色collisionU,collisionV

if (nParticleShape1.collisionU >0) { float $UnParticleShape1.collisionU; float $VnParticleShape1.collisionV; vector $colRGB colorAtPoint -o RGB -u $U -v $V ramp2; nParticleShape1.rgbPP $colRGB; } 获取 UV 向量处的颜色 vector $colRGB colorAtPoin…

【C51 介绍发光二极管LED】

51单片机项目基础篇 前篇&#xff1a;介绍发光二极管LED1、认识发光二极管LED1.1、二极管1.2、二极管的特性 2、LED简介3、结束语 前篇&#xff1a;介绍发光二极管LED 前言&#xff1a; (1).我们已经认识了 51 单片机芯片和 51 单片机最小系统。 (2).现在进入一些基础的实验阶…

23.07.09

完善对话框功能 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);// this->setWindowOpacity(0); } Widget::~Widget() {delete ui; } //字体对应的槽 voi…

常见的页面标签

一、基本标签 <p>段落标签</p> 换行且有空行 hn(1-6) 标题标签 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> ..... <br> <br /> <br/> 换…

3.8.使用cuda核函数加速yolov5后处理

目录 前言1. Yolov5后处理2. 后处理案例2.1 cpu_decode2.2 gpu_decode 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简…

Zabbix自动报表功能

一、简介 从zabbix 5.4体验版本发布时提供了很多新特性&#xff0c;当然现在最新的Zabbix6.0 LTS版本的定时导出PDF报表功能相对稳定&#xff0c;但如果需要满足日常运维报表需求还是有一段比较长的路要走。总而言之相比以前版本此功能可谓是一大突破。可按照Dashboard维度&am…

计网之体系结构(一)

计网之体系结构&#xff08;一&#xff09; 计算机网络概述计算机网络的概念计算机网络的功能计算机网络的发展计算机网络发展第一阶段计算机网络发展第二阶段&#xff08;三级结构&#xff09;计算机网络发展第三阶段&#xff08;多层次ISP结构&#xff09; 概念&#xff0c;功…