StarRocks表设计——排序键和数据模型

 该篇文章介绍StarRocks-2.5.4版本的数据模型相关内容,有误请指出~

目录

一、数据模型概述

1.1 四种模型

1.2 排序键

1.2.1 概述

1.2.2 分类

1.2.3 注意事项

二、明细模型

2.1 概述

2.2 适用场景

2.3 建表语句及说明

三、聚合模型

3.1 概述

3.2 适用场景

3.3 聚合原理

3.3 建表语句及说明

四、更新模型

4.1 概述

4.2 适用场景

4.3 更新原理

4.4 建表语句及说明

五、主键模型

5.1 概述

5.2 适用场景

5.3 更新原理

5.4 建表语句及说明

一、数据模型概述

     在 StarRocks中,数据以表(Table)的形式进行逻辑上的描述。 一张表包括行(Row)和列(Column)。Row 即用户的一行数据,Column 用于描述一行数据中不同的字段。

     Column可以分为两大类:Key和Value,从业务角度看,Key 和 Value分别对应维度列和指标列。StarRocks的key列是建表语句中指定的列,建表语句中的关键字 'duplicate key'、'aggregate key'、'unique key'、' primary key' 后面的列就是Key列除了 Key列剩下的就是Value列

1.1 四种模型

  • Duplicate Key Model:明细模型
  • Aggregate Key Model:聚合模型
  • Unique Key Model:更新模型
  • Primary Key Model:主键模型

1.2 排序键

1.2.1 概述

      StarRocks为了加速查询,底层的数据是按照指定的列排序存储的,这部分用于排序的列(可以是一列或多列),就称为排序键(Sort Key)。以排序列作为条件进行数据查找,会非常的高效。

    直观来看,各个模型的排序键就是建表语句中duplicate key、aggregate key、unique key或primary key后面指定的列。但是四种模型的排序键还是有一些区别:

1.2.2 分类

  • 明细模型:明细模型排序键写法比较灵活,可以指定部分的维度列为排序键。可以使用duplicate key()显式定义排序键。如果省略duplicate key(列1,列2……)时,默认选择表的前三列作为排序键。在建表语句中,排序键必须定义在其他列之前。指定排序键的时候,列的顺序要和建表语句中的相同,否则建表语句会报错。
#建表语句:
create table if not exists test1 (event_time datetime not null comment "datetime of event",event_type int not null comment "type of event",user_id int comment "id of user",channel int comment ""
)
duplicate key(event_time, event_type,user_id)
distributed by hash(user_id) buckets 10;#===如果使用duplicate key()显式定义排序键,单从建表不报错的角度,可以有四种组合:
event_time
event_time, event_type
event_time, event_type, user_id
event_time, event_type, user_id, channel#===如果省略duplicate key(列1,列2……),默认选择表的前三列作为排序键。
create table if not exists test1 (event_time datetime not null comment "datetime of event",event_type int not null comment "type of event",user_id int comment "id of user",channel int comment ""
)
distributed by hash(user_id) buckets 10;
#等价于:
create table if not exists test1 (event_time datetime not null comment "datetime of event",event_type int not null comment "type of event",user_id int comment "id of user",channel int comment ""
)
duplicate key(event_time, event_type,user_id)
distributed by hash(user_id) buckets 10;
  • 聚合表:据按照排序键aggregate key聚合后排序,排序键需要满足唯一性约束,并且需要按建表顺序指定所有的维度列。
#建表语句:
create table if not exists test2(site_id largeint not null comment "id of site",date date not null comment "time of event",city_code varchar(20) comment "city_code of user",pv bigint sum default "0" comment "total page views"
)
aggregate key(site_id, date, city_code)
distributed by hash(site_id)
properties (
"replication_num" = "3"
);#排序键必须满足唯一性约束,并且需要按建表顺序指定所有的维度列
#上述的排序键是site_id, date, city_code,指标键是pv #  上述的建表语句可以简写为:
create table if not exists test2(site_id largeint not null comment "id of site",date date not null comment "time of event",city_code varchar(20) comment "city_code of user",pv bigint sum default "0" comment "total page views"
)
distributed by hash(site_id)
properties (
"replication_num" = "3"
);
  • 更新模型: 更新模型的排序键(也称主键)只有一种写法,就是在unique key()的括号中指定,并且排序键需要满足唯一性约束。
#建表语句:
create table if not exists test3(create_time date not null comment "create time of an order",order_id bigint not null comment "id of an order",order_state int comment "state of an order",total_price bigint comment "price of an order"
)
unique key(create_time, order_id)
distributed by hash(order_id) buckets 8
properties (
"replication_num" = "3"
); #上述代码,排序键是create_time, order_id
将经常使用的过滤字段订单创建时间create_time、订单编号order_id 作为主键(也是排序键),其余列订单状态 order_state和订单总价total_price作为指标列

更新模型和主键模型的排序键只有一种写法,就是在UNIQUE KEY()的括号中指定。以table04为例,建表时排序键语句为UNIQUE KEY(create_time, order_id),则用于排序的列就是create_time和order_id。更新模型/主键模型的排序键必需显式指定,不能省略不写。

  • 主键模型:主键模型的排序键在primary key()括号中指定,并且排序键需要满足唯一性约束。

1.2.3 注意事项

  • 在建表语句中,排序键必须定义在其他列之前
  • 指定排序键的时候,列的顺序要和建表语句中的相同,否则建表语句会报错
  • 在创建表时,可以将一个或多个列定义为排序键。排序键在建表语句中的出现次序,为数据存储时多重排序的次序
  • 排序键不要包含过多的列。如果选择了大量的列用于排序,那么排序的开销会导致数据导入的时间和资源使用增加
  • 排序键的选择需要结合查询业务场景,建表时可以将经常作为查询条件的列指定为排序键。当排序键涉及多个列的时候,我们要将区分度高、经常查询的列建议放在前面。

二、明细模型

2.1 概述

     明细模型是StarRocks中最常用的数据模型,适用于既没有聚合需求,又没有主键唯一性约束的原始数据的存储。在该模型下,即便导入两条完全相同的数据,StarRocks也会将数据原封不动的保存进表。

2.2 适用场景

   明细模型通常用于追加式的数据写入,比较适合:

  • 查询方式灵活,不需要局限于预聚合的分析方式
  • 旧数据不会更新,只会追加新的数据

2.3 建表语句及说明

#  建表语句如下
create table if not exists detail (event_time datetime not null comment "datetime of event",event_type int not null comment "type of event",user_id int comment "id of user",device_code int comment "device code",channel int comment ""
)
duplicate key(event_time, event_type)
distributed by hash(user_id)
properties (
"replication_num" = "3"
);#使用duplicate keY(event_time, event_type,user_id )显式的说明采用明细模型
#指定event_time、event_type和user_id 作为排序键
#user_id作为分桶键,全表只有一个分区

建表说明:

  • 建表时必须使用distributed by hash子句指定分桶键,否则建表失败
  • 在建表语句中,排序键必须定义在其他列之前,上述建表语句中排序键为 event_time和 event_type

  • 明细模型中的排序键可以为部分或全部维度列;
  • 在省略duplicate key(列1,列2……)时,默认选择表的前三列作为排序键
#  上述的建表语句可以简写为:
create table if not exists detail (event_time datetime not null comment "datetime of event",event_type int not null comment "type of event",user_id int comment "id of user",device_code int comment "device code",channel int comment ""
)
distributed by hash(user_id)
properties (
"replication_num" = "3"
);

三、聚合模型

3.1 概述

    建表时定义排序键(维度列key)和指标列(指标列value),并为指标列指定聚合函数。聚合模型会在数据导入时将维度列相同的数据,根据指标列设定的聚合函数进行聚合,最终表格中只会保留聚合后的数据。

3.2 适用场景

  • 分析统计和汇总数据,例如:用户的访问总时长、访问总次数
  • 不需要查询原始的明细数据

3.3 聚合原理

   数据的聚合,在StarRocks中有如下三个阶段发生,聚合模型的实现方式是读时合并(merge on read)。

   ps: 这种实现方式的表简称为Mor 表,Mor 表是指在导入数据时,不会对数据进行合并,而是在查询时动态合并数据。这种方式可以提高导入速度,但是会增加查询开销。虽然写入时处理简单高效,但是查询时需要在线聚合多版本。并且由于 Merge 算子的存在,谓词和索引无法下推,严重影响了查询性能。

  • 每一批次数据导入的 ETL 阶段:每一个批次的数据形成一个版本version,在一个版本中,同一个排序键的数据内部进行聚合
  • 底层BE进行数据 Compaction 的阶段:BE 会对已导入的多版本的文件定期合并成一个大版本文件
  • 数据查询阶段:对于查询涉及到的数据,所有版本的同一排序键的数据进行聚合,然后再返回查询最终结果

3.3 建表语句及说明

#分析某一段时间内,来自不同城市的用户,访问不同网页的总次数
create table if not exists aggregate_tbl (site_id largeint not null comment "id of site",date date not null comment "time of event",city_code varchar(20) comment "city_code of user",pv bigint sum default "0" comment "total page views"
)
aggregate key(site_id, date, city_code)
distributed by hash(site_id)
properties (
"replication_num" = "3"
);#排序键必须满足唯一性约束,并且需要按建表顺序指定所有的维度列
#上述的排序键是site_id, date, city_code

 建表说明:

  • 建表时必须使用distributed by hash子句指定分桶键,否则建表失败。
  • 排序键:在建表语句中,排序键必须定义在其他列之前。排序键可以通过aggregate key显式定义,上述建表语句中排序键为site_id、date和city_code ,指标列是pv。
  • 如果不通过aggregate key显示定义排序键,则默认除指标列之外的列均为排序键。
#  上述的建表语句可以简写为:
create table if not exists aggregate_tbl (site_id largeint not null comment "id of site",date date not null comment "time of event",city_code varchar(20) comment "city_code of user",pv bigint sum default "0" comment "total page views"
)
distributed by hash(site_id)
properties (
"replication_num" = "3"
);
  • 指标列:通过在列名后指定聚合函数,定义该列为指标列,一般为需要汇总统计的数据。

  • 聚合函数:指标列使用的聚合函数,例如sum,max等。

  • 查询时,排序键的过滤在多版本的聚合之前进行,而指标列的过滤在多版本的聚合之后。因此建表可以将频繁使用的过滤字段作为排序键,这样在对数据聚合之前,就可以先过滤一批数据,提升查询性能。

四、更新模型

4.1 概述

     建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。

     明细模型会将所有写入的数据保留,聚合模型是对写入的数据进行聚合处理,而更新模型的特点是只保留相同主键下最新导入的数据。在更新模型中,排序键构成表的唯一性约束,成为我们常说的“主键”。

4.2 适用场景

    实时和频繁更新的业务场景,例如电商场景中,订单状态经常变化,每天的订单更新量可能会突破上亿。

4.3 更新原理

   更新模型本质上是聚合模型的一个特例, 更新模型的指标列指定的聚合函数为replace,返回具有相同主键的一组数据中的最新数据。聚合模型的实现方式是读时合并(merge on read),Unique模型新的实现方式也是读时合并(merge on read)。 

     ps: 这种实现方式的表简称为Mor 表,Mor 表是指在导入数据时,不会对数据进行合并,而是在查询时动态合并数据。这种方式可以提高导入速度,但是会增加查询开销。虽然写入时处理简单高效,但是查询时需要在线聚合多版本。并且由于 Merge 算子的存在,谓词和索引无法下推,严重影响了查询性能。

4.4 建表语句及说明

#在电商订单分析场景中,经常按照日期对订单状态进行统计分析
create table if not exists orders (create_time date not null comment "create time of an order",order_id bigint not null comment "id of an order",order_state int comment "state of an order",total_price bigint comment "price of an order"
)
unique key(create_time, order_id)
distributed by hash(order_id) buckets 8
properties (
"replication_num" = "3"
); #既能够满足实时更新订单状态的需求,又能够在查询中进行快速过滤#将经常使用的过滤字段订单创建时间create_time、订单编号order_id 作为主键,其余列订单状态 order_state和订单总价total_price作为指标列

 建表说明:

  • 建表时必须使用distributed by hash子句指定分桶键,否则建表失败
  • 在建表语句中,排序键(该模型中的排序键也称作主键)必须定义在其他列之前,上述建表语句中排序键(主键)为 create_time, order_id
  • 主键必须满足唯一性约束
  • 查询时,排序键(主键)的过滤在多版本的聚合之前进行,而指标列的过滤在多版本的聚合之后。因此建表可以将频繁使用的过滤字段作为排序键,这样在对数据聚合之前,就可以先过滤一批数据,提升查询性能。

五、主键模型

5.1 概述

   建表时,支持定义主键和指标列,查询时返回主键相同的一组数据中的最新数据。主键模型和更新模型的区别在于:更新模型的实现方式是读时合并(merge on read),简称Mor Primary 模型实现方式是写时合并(merge on write),简称Mow。聚合模型和更新模型都不支持update功能,主键模型通过Delete+Insert 的策略,实现update功能。

 ps:(更新模型)Mor 表是指在导入数据时,不会对数据进行合并,而是在查询时动态合并数据。这种方式可以提高导入速度,但是会增加查询开销虽然写入时处理简单高效,但是查询时需要在线聚合多版本。并且由于 Merge 算子的存在,谓词和索引无法下推,严重影响了查询性能

    (主键模型)Mow表是指在导入数据时,会对数据进行合并,保证每个 key 值只有一条记录,即数据在导入阶段就将被覆盖和被更新的数据进行标记删除,同时将新的数据写入新的文件。在查询的时候, 所有被标记删除的数据都会在文件级别被过滤掉,读取出来的数据就都是最新的数据,消除掉了读时合并中的数据聚合过程。这种方式可以提高查询速度,但是会增加导入开销。相对于更新模型,主键模型在查询时不需要执行聚合操作,并且支持谓词和索引下推。

5.2 适用场景

主键模型适用于实时和频繁更新的场景,例如:

  • 实时对接事务型数据至 StarRocks:事务型数据库中,除了插入数据外,一般还会涉及较多更新和删除数据的操作
  • 支持部分列更新轻松实现多流 JOIN:主键模型的部分列更新功能就很好地满足这种需求,不同业务直接各自按需更新与业务相关的列即可,并且继续享受主键模型的实时同步增删改数据及高效的查询性能

5.3 更新原理

      主键模型采用了 Delete+Insert 的策略,保证同一个主键下仅存在一条记录,这样就完全避免了 Merge 操作。主键模型实现方式是写时合并(merge on write),即数据在导入阶段就将被覆盖和被更新的数据进行标记删除,同时将新的数据写入新的文件。在查询的时候, 所有被标记删除的数据都会在文件级别被过滤掉,读取出来的数据就都是最新的数据,消除掉了读时合并中的数据聚合过程。写时合并(merge on write)的实现方式如下:

  • StarRocks 收到对某记录的更新操作时,会通过主键索引找到该条记录的位置,并对其标记为删除(旧记录标记删除Delete),再插入一条新的记录。相当于把Update改写为 Delete+Insert。

  • StarRocks 收到对某记录的删除操作时,会通过主键索引找到该条记录的位置,对其标记为删除(旧记录标记删除)。

5.4 建表语句及说明

# 需要实时分析用户情况,将user_id 作为主键,其余为指标列。建表语句如下:
create table users (user_id bigint not null,name string not null,email string null,address string null,age tinyint null,sex tinyint null,last_active datetime,property0 tinyint not null,property1 tinyint not null,property2 tinyint not null,property3 tinyint not null
) primary key (user_id)
distributed by hash(user_id) buckets 4
properties ("replication_num" = "3","enable_persistent_index" = "true"
);#分区列和分桶列必须在主键中,该表中的分桶键(分桶列)是user_id,全表只有一个分区

 建表说明:

  • 建表时必须使用distributed by hash子句指定分桶键,否则建表失败
  • 在建表语句中,主键必须定义在其他列之前
  • 主键通过primary key定义,本示例中主键为user_id
  • 主键必须满足唯一性约束
  • 分区列和分桶列必须在主键中

参考文章:

数据模型 - Apache Doris

第2.2章:StarRocks表设计--数据模型_starrocks 自增主键-CSDN博客

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

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

相关文章

RPA基础知识学习清单

序号 主题 内容 1 HTML编程基础 HTML基本概念及文档结构 2 HTML标签及表单

Linux线程(1)--线程的概念 | 线程控制

目录 前置知识 线程的概念 Linux中对线程的理解 重新定义进程与线程 重谈地址空间 线程的优缺点 线程的优点 线程的缺点 线程异常 线程的用途 Linux线程 VS 进程 线程控制 创建线程 线程等待 线程终止 线程ID的深入理解 前置知识 我们知道一个进程有属于自己的P…

docker (六)-进阶篇-数据持久化最佳实践MySQL部署

容器的数据挂载通常指的是将宿主机(虚拟机或物理机)上的目录或文件挂载到容器内部 MySQL单节点安装 详情参考docker官网文档 1 创建对应的数据目录、日志目录、配置文件目录(参考二进制安装,需自己建立数据存储目录) mkdir -p /data/mysq…

计算机毕业设计springboot_vue房屋租赁系统_ku668

1.掌握Html,Css,JavaScript等基础编程语言。 2.掌握Vue框架,node环境,数据库等知识。 3.掌握开发系统的基本流程。 …

动态规划初识心得

今天开始了动态规划算法,经过三道题的洗礼,再加上文档的帮助,我找到了规律(只是从这三道题,并不一定适合所有动态规划)。 比如:509.斐波那契数:对于这道题,一定是要从前向后计算,因…

你了解API测试吗?如何充分的测试一个API?

什么是API? API代表应用程序接口。API是软件系统中的中间层,负责数据源与用户看到的图形用户界面(GUI)之间的数据通信。换句话说,API是软件的业务层,它在表示层和数据层之间创建连接。 API测试侧重于所谓的…

2.17C语言学习

P1678 烦恼的高考志愿 写完后发现题解里面用的是优先队列或者二分什么的,其实这个题可以贪心,我们把学校的分数线和学生的成绩分别进行排序,然后从前往后遍历,每次比较当前学校的分数与学生成绩的差距和下一个学校的分数与学生成…

111 C++ typename

介绍typename之前&#xff0c;应先了解几个概念&#xff1a; 1. 限定名与非限定名 限定名&#xff0c;顾名思义&#xff0c;是限定了命名空间的名称。 #include <iostream>int main() {std::cout << "Hello world!" << std::endl; } std::限定…

re-captioning技术是什么

参考https://zhuanlan.zhihu.com/p/664192860 模型对图片进行caption操作时&#xff0c;输出的标题一般描述图片中的主体&#xff0c;而忽视了背景、常识关系等更为细节的描述。 图片比较重要的细节的描述应当包括&#xff1a; 物体存在的场景。如&#xff1a;在厨房的水槽&am…

ValueError check_hostname requires server_hostname 报错

一、报错再现 我准备了一个工具环境&#xff0c;这里面有一些工具包需要安装&#xff0c;当我运行一下代码&#xff1a; pip install -r requirements-cpu.txt回车过后&#xff0c;发生了如下报错&#xff1a; ERROR: Exception: Traceback (most recent call last):File &q…

Qt之条件变量QWaitCondition详解(从使用到原理分析全)

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …

阿里云服务器服务费怎么计算的?详细报价解析

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

算法学习(六)前缀和

前缀和 1. 概念 前缀和算法是一种用于高效计算数组前缀和的算法。前缀和是指从数组的起始位置到某一位置的所有元素的和。下面是前缀和算法的基本步骤&#xff1a; 创建一个与原始数组相同长度的前缀和数组。初始时&#xff0c;前缀和数组的第一个元素与原始数组的第一个元素…

001 - Hugo, 创建一个网站

001 - Hugo, 创建一个网站安装hugoWindows系统Macos Hugo博客搭建初始化博客主题安装配置博客各个页面开始创作创建 GitHub Page 仓库本地调试和预览发布内容 教程及鸣谢文字教程视频教程 001 - Hugo, 创建一个网站 这篇文章假设你已经&#xff1a; 了解基本的终端命令行知识&…

LaTeX中的计数器counter

诸神缄默不语-个人CSDN博文目录 计数器在LaTeX文档中扮演着重要的角色&#xff0c;用于自动化管理章节编号、页码、图表编号等。 计数器可以理解为LaTeX中的一个变量&#xff0c;用于存储一个整数&#xff0c;LaTeX通过这些计数器来控制文档的各种编号。 文章目录 创建计数器设…

黑马鸿蒙教程学习1:Helloworld

今年打算粗略学习下鸿蒙开发&#xff0c;当作兴趣爱好&#xff0c;通过下华为那个鸿蒙开发认证&#xff0c; 发现黑马的课程不错&#xff0c;有视频和完整的代码和课件下载&#xff0c;装个devstudio就行了&#xff0c;建议32G内存。 今年的确是鸿蒙大爆发的一年呀&#xff0c;…

Win32汇编数组学习2

之前学习过win32汇编数组&#xff1b;还不熟悉&#xff1b;继续熟悉&#xff1b; 先做几个基本的对话框&#xff0c;有一个静态文本框&#xff1b; 定义数组之后&#xff0c;用 wsprintf 函数格式化&#xff0c;然后调用 SetDlgItemText 赋值给静态文本框&#xff1b; arr1 …

【力扣hot100】刷题笔记Day5

前言 回学校了&#xff0c;荒废了半天之后打算奋发图强猛猛刷题&#xff0c;找实习&#xff01;赚钱&#xff01;&#xff01; 560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 前缀法 哈希表 这个题解解释比官方清晰&#xff0c;截个图方便看&#xff0c;另一…

OpenCV-42 直方图均匀化

目录 一、直方图均匀化原理 二、直方图均匀化在OpenCV中的运用 一、直方图均匀化原理 直方图均匀化是通过拉伸像素强度的分布范围&#xff0c;使得在0~255灰阶上的分布更加均匀&#xff0c;提高图像的对比度。达到改善图像主管视觉效果的目的。对比度较低的图像适合使用直方…

由于找不到MSVCP140.dll无法运行软件游戏,多种解决方法分享

电脑系统在运行过程中&#xff0c;当出现“由于找不到MSVCP140.dll”这一提示时&#xff0c;可能会引发一系列潜在的问题与影响。当电脑无法找到这个特定的dll文件时&#xff0c;意味着相关应用可能无法顺利加载并执行必要的组件&#xff0c;进而导致程序无法启动或运行过程中频…