大数据实时数仓Hologres(三):存储格式介绍

文章目录

存储格式介绍

一、格式

二、使用建议

三、技术原理

1、列存

2、行存

3、行列共存

四、使用示例 


存储格式介绍

一、格式

在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指定表的存储格式,语法如下:

-- 2.1版本起支持
CREATE TABLE <table_name> (...) WITH (orientation = '[column | row | row,column]');-- 所有版本支持
BEGIN;
CREATE TABLE <table_name> (...);
call set_table_property('<table_name>', 'orientation', '[column | row | row,column]');
COMMIT;

 注意事项:

  • orientation:指定了数据库表在Hologres中的存储模式是列存还是行存,Hologres从 V1.1版本开始支持行列共存的模式。
  • 建表时默认为列存(column storage)形式。行存或行列共存需要在建表时显式指定。修改表的存储格式需要重新建表,不能直接转换。

二、使用建议

表的存储模式使用建议如下:

三、技术原理

1、列存

begin;
create table public.tbl_col (
id text NOT NULL,
name text NOT NULL,
class text NOT NULL,
in_time TIMESTAMPTZ NOT NULL,
PRIMARY KEY (id)
);
call set_table_property('public.tbl_col', 'orientation', 'column');
call set_table_property('public.tbl_col', 'clustering_key', 'class');
call set_table_property('public.tbl_col', 'bitmap_columns', 'name');
call set_table_property('public.tbl_col', 'event_time_column', 'in_time');
commit;
select * from public.tbl_col where id ='3333';
select id, class,name from public.tbl_col where id < '3333' order by id;

示意图如下图:

2、行存

如果Hologres的表设置的是行存,那么数据将会按照行存储。行存默认使用SST格式,数据按照Key有序分块压缩存储,并且通过Block Index、Bloom Filter等索引,以及后台Compaction机制对文件进行整理,优化点查查询效率。

  • PK和Clustering Key一致 

系统会为每张表在底层存储一个主键索引文件,详情请参见主键Primary Key。行存表设置了Primary Key(PK)的场景,系统会自动生成一个Row Identifier(RID),RID用于定位整行数据,同时系统也会将PK设置为Distribution Key和Clustering Key,这样就能快速定位到数据所在的Shard和文件,在基于主键查询的场景上,只需要扫描一个主键就能快速拿到所有列的全行数据,提升查询效率。

  • PK和Clustering Key不一致

如果在建表时,设置表为行存表,且将PK和Clustering Key设置为不同的字段,查询时,系统会根据PK定位到Clustering Key和RID,再通过Clustering Key和RID快速定位到全行数据,相当于扫描了两次,有一定的性能牺牲。

  • (推荐)设置主键Primary Key
begin;
create table public.tbl_row (id text NOT NULL,name text NOT NULL,class text ,
PRIMARY KEY (id)
);
call set_table_property('public.tbl_row', 'orientation', 'row');
call set_table_property('public.tbl_row', 'clustering_key', 'id');
call set_table_property('public.tbl_row', 'distribution_key', 'id');
commit;--基于PK的点查示例
select * from public.tbl_row where id ='1111';--查询多个key
select * from public.tbl_row where id in ('1111','2222','3333'); 
begin;
create table public.tbl_row (id text NOT NULL,name text NOT NULL,class text ,
PRIMARY KEY (id)
);
call set_table_property('public.tbl_row', 'orientation', 'row');
call set_table_property('public.tbl_row', 'clustering_key', 'id');
call set_table_property('public.tbl_row', 'distribution_key', 'id');
commit;--基于PK的点查示例
select * from public.tbl_row where id ='1111';

  • 设置的PK和Clustering Key不一致(不建议使用) 
begin;
create table public.tbl_row (id text NOT NULL,name text NOT NULL,class text ,
PRIMARY KEY (id)
);
call set_table_property('public.tbl_row', 'orientation', 'row');
call set_table_property('public.tbl_row', 'clustering_key', 'name');
call set_table_property('public.tbl_row', 'distribution_key', 'id');
commit;

行存总结: 

  1. 行存表非常适用于基于PK的点查场景,能够实现高QPS的点查。
  2. 建表时建议只设置PK,系统会自动将PK设置为Distribution Key和Clustering Key,以提升查询性能。
  3. 不建议将PK和Clustering Key设置为不同的字段,设置为不同的字段会有一定的性能牺牲。

3、行列共存

在实际应用场景中,一张表可能用于主键点查,又用于OLAP查询,因此Hologres在V1.1版本支持了行列共存的存储格式。行列共存同时拥有行列和列存的能力,既支持高性能的基于PK点查,又支持OLAP分析。数据在底层存储时会存储两份,一份按照行存格式存储,一份按照列存格式存储,因此会带来更多的存储开销。

  • 数据写入时,会同时写一份行存格式和写一份列存格式,只有两份数据都写完了才会返回成功,保证数据的原子性。
  • 数据查询时,优化器会根据SQL,解析出对应的执行计划,执行引擎会根据执行计划判断走行存还是列存的查询效率更高,要求行列共存的表必须设置主键。

因此行列共存表在通常查询场景,尤其是非主键点查场景,查询效率更好,示例:

begin;
create table public.tbl_row_col (
id text NOT NULL,
name text NOT NULL,
class text ,
PRIMARY KEY (id)
);
call set_table_property('public.tbl_row_col', 'orientation','row,column');
call set_table_property('public.tbl_row_col', 'distribution_key','id');
call set_table_property('public.tbl_row_col', 'clustering_key','class');
call set_table_property('public.tbl_row_col', 'bitmap_columns','name');
commit;SELECT * FROM public.tbl_row_col where id ='2222'; --基于主键的点查
SELECT * FROM public.tbl_row_col where class='二班';--非主键点查
SELECT * FROM public.tbl_row_col where id ='2222' and class='二班'; --普通OLAP查

示意图如下:

四、使用示例 

创建不同存储模式的表使用示例如下:

--建行存表
begin;
create table public.tbl_row (a integer NOT NULL,b text NOT NULL,PRIMARY KEY (a)
);
call set_table_property('public.tbl_row', 'orientation', 'row');
commit;--建列存表
begin;
create table tbl_col (a int not null, b text not null);
call set_table_property('tbl_col', 'orientation', 'column');
commit;--建行列共存
begin;
create table tbl_col_row (pk  text  not null, col1 text, col2 text, col3 text, PRIMARY KEY (pk)); 
call set_table_property('tbl_col_row', 'orientation', 'row,column');
commit;

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

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

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

相关文章

云计算 Cloud Computing

文章目录 1、云计算2、背景3、云计算的特点4、云计算的类型&#xff1a;按提供的服务划分5、云计算的类型&#xff1a;按部署的形式划分 1、云计算 定义&#xff1a; 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可…

Java中的五种I/O模型详解

一、阻塞I/O&#xff08;Blocking I/O&#xff09; 1.1 概念 阻塞I/O是最传统的I/O模型。在该模型中&#xff0c;当一个线程执行I/O操作时&#xff0c;如果没有数据可读或可写&#xff0c;线程将会被阻塞&#xff0c;直到I/O操作完成。 1.2 工作原理 当线程调用读取或写入数…

解决nginx+tomcat宕机完美解决方案

问题描述&#xff1a;公司项目太老了&#xff0c;还是tomcat项目&#xff0c;部署两台tomcat,做了nginx负载。最近发现每到上午10&#xff0c;下午3点&#xff0c;tomcat就宕机了&#xff0c;死活找不到原因&#xff0c;客户影响超期差&#xff0c;实在让人头疼。 解决思路&am…

今日指数项目实现个股日K线详情功能

个股日K线详情功能 一. 什么是个股日K线 1.日K线就是将股票交易流水按天分组&#xff0c;然后统计出每天的交易数据&#xff0c;内容包含&#xff1a;日期、股票编码、名称、最高价、最低价、开盘价、收盘价、前收盘价、交易量&#xff1b; 2.需要注意的是这里的收盘价就是指…

MySQL:进阶巩固-存储过程

目录 一、存储过程的概述二、存储过程的基本使用2.1 创建存储过程2.2 使用存储过程2.3 查询指定数据库的存储过程以及状态信息2.4 查看某个存储过程的定义2.5 删除存储过程2.6 案例 三、存储过程的变量设置3.1 系统变量3.2 用户自定义变量3.3 局部变量 四、IF判断五、参数六、C…

spring boot项目对接人大金仓

先确认一下依赖 第一 是否引入了mybatis-plus多数据源&#xff0c;如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…

LeetCode 热题 100 回顾18

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

Rainbond 助力城建智控,从传统开发到敏捷开发转型

在现代企业的数字化转型过程中&#xff0c;如何高效管理和快速部署业务应用已经成为各行业的核心挑战。尤其是在智慧工地和办公自动化&#xff08;OA&#xff09;这样的关键业务场景中&#xff0c;企业不仅需要面对频繁的系统更新&#xff0c;还要确保系统的稳定性与高效运作。…

Python库matplotlib之五

Python库matplotlib之五 小部件(widget)RangeSlider构造器APIs应用实列 TextBox构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例&#xff0c;并将其作为第一个参数传递。 Matplotlib不会试图布局这些小部件…

经典sql题(十二)UDTF之Explode炸裂函数

1. EXPLODE: UDTF 函数 1.1 功能说明 EXPLODE 函数 是Hive 中的一种用户定义的表函数&#xff08;UDTF&#xff09;&#xff0c;用于将数组或映射结构中的复杂的数据结构每个元素拆分为单独的行。这在处理复杂数据时非常有用&#xff0c;尤其是在需要将嵌套数据“打散”以便更…

测试面试题:pytest断言时,数据是符点类型,如何断言?

在使用 Pytest 进行断言时&#xff0c;如果数据是浮点类型&#xff0c;可以使用以下方法进行断言&#xff1a; 一、使用pytest.approx pytest.approx可以用来比较两个浮点数是否近似相等。例如&#xff1a; import pytestdef test_float_assertion():result 3.14159expecte…

OpenCV背景建模:从基础到实践

OpenCV中的背景建模是一种在计算机视觉中常用的技术&#xff0c;主要用于从视频或图像序列中分离出前景&#xff08;运动物体&#xff09;和背景。以下将详细介绍OpenCV中几种常见的背景建模方法&#xff1a; 1. 帧差法&#xff08;非直接称为backgroundSubtractor&#xff09…

探索高效免费的PDF转Word工具,开启便捷办公之旅

无论是为了方便对文档内容进行编辑、修改&#xff0c;还是为了更好地适应不同的工作和学习场景&#xff0c;将 PDF 文档转换为可编辑的 Word 格式都具有重要意义。今天我就分享几款pdf转换成word免费版工具来解决大家的困扰。 1.Foxit PDF转换大师 链接一下>>https://w…

Mirror | homebrew 镜像源配置

1. 详细步骤 1.1 临时使用 因为长期设置不知道为什么&#xff0c;可能会有不生效的情况&#xff0c;所以发现好像卡着 没有走清华源的时候&#xff0c;可以临时使用 # 设置清华镜像源&#xff1a;五行一起拷贝执行 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.ts…

[ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题

问题描述 由前一篇文章https://blog.csdn.net/jay547063443/article/details/142059700?fromshareblogdetail&sharetypeblogdetail&sharerId142059700&sharereferPC&sharesourcejay547063443&sharefromfrom_link&#xff0c;移植HDMI-IN部分驱动后出现&a…

taobao.item_get_appAPI接口原app数据测试指南

在电商竞争日益激烈的当下&#xff0c;数据成为了商家们争夺市场的重要武器。淘宝&#xff0c;作为中国最大的在线零售平台&#xff0c;其庞大的商品库和用户群体为商家提供了巨大的商机。为了帮助商家更好地了解市场动态&#xff0c;优化库存和营销策略&#xff0c;淘宝推出了…

使用WebClient 快速发起请求(不使用WebClientUtils工具类)

使用WebClient发起网络请求_webclient工具类-CSDN博客文章浏览阅读717次&#xff0c;点赞9次&#xff0c;收藏8次。使用WebClient发起网络请求_webclient工具类https://blog.csdn.net/qq_43544074/article/details/137044825这个是使用工具类发起的&#xff0c;下面就不使用工具…

java基础(4)类和对象

目录 1.前言 2.正文 2.1类的定义与使用 2.1.1类的定义 2.1.2类的实例化 2.1.3this引用 2.1.3.1 访问当前对象的成员变量 2.1.3.2调用当前对象的成员方法 2.1.3.3构造函数中的 this 2.1.3.4归纳this 2.2封装 2.2.1封装的定义 2.2.2访问修饰符 2.3static 2.3.1sta…

Kevin‘s notes about Qt---Episode 6 不同类中创建同一对象

问题描述 使用场景 现在在我的Qt界面中需要同时使用采集卡的AI(Analog Input)和AO(Analog Output)功能,均已分别调通,但是像之前一样通过创建两个类,然后分别在两个线程中进行操作的方式并不能实现。 原本写法 头文件 art_ao.h 核心代码如下: #ifndef ART_AO_H #defi…

python自动更新chromedriver

python自动化过程中&#xff0c;经常遇到脚本跑着跑着&#xff0c;就报错&#xff0c;一看&#xff0c;浏览器自动升级了。 共两张解决方案&#xff1a; 1、禁止浏览器自动升级 2、当脚本运行前先去检测当前的chromedriver与浏览器是否匹配&#xff0c;不匹配&#xff0c;就下载…