快速上手 Hologres(二)|学习笔记

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 快速学习快速上手 Hologres(二)

开发者学堂课程【实时数仓 Hologres 实战课程快速上手 Hologres(二)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/904/detail/14389


快速上手 Hologres(二)


七,Hologres 常见的基本操作

(1)存储属性设置

l Hologres 目前通过 set_table_property procedure 来指定表的额外物理存储属性,合理设置 tableproperty 对于查询的性能影响极大

set_table_property 的调用需要与 create table 在同一事务中执

set_table_property 对于同一个 key 不能重复调用

call set_table_property ( 'table_name ' , 'orientation ', ' [column | row]');

call set_table_property( ' table_name ' , 'clustering_key ' ,' [ columnName : [ desclasc]][...1."call set_table_property( 'table_name ' , 'segment_key',' [ columnName[ ,...]]');

call set_table_property( 'table_name' , 'bitmap_columns ' , '[ columnName[ , . ..]]');

call set_table_property( 'table_name ' , 'dictionary_encoding_columns ' , ' [ columnName[ ,...]]'call set_table_property( 'table_name ' , 'time_to_live_in_seconds ' , '<non_negative_literaly'call set_table_property( ' table_name ' , 'distribution_key ', ' [ columnName[ , . ..]]');

(2)存储类型设置

l Hologres 目前支持按行存储和按列存储两种存储类型,通过 orientation 来指定

l 按行存储对于高 QPS 的基于 primary key 的点查询性能较好,例如 where pk=abc,其余场景都该选用列存

begin ;

create table tbl (a int not null, b text not null,PRIMARY KEY( a ) );call set_table_property ( "tbl' , "orientation " , "row ' ) ;

conmit;

--适合的查询

select * from tbl where a = 180;

begin ;

create table tbl (a int not null, b text not null,PRIMARY KEY( a));call set_table_property ( "tbl ' , "crientation ' , 'column ' );

c onmmit ;

--适合的查询

select sum(a) from tbl group by b;

(3)聚簇键设置

l clustering_key 指定一些列作为聚簇索引,Hologres 在指定的列上将建立聚簇索引。Hologres 会在聚簇索引上对数据进行排序,建立聚簇索引能够加速用户在索引列上的 range 和 filter 查询

l 数据类型为 floatdouble 的列,不能设置为 clustering_key

l 每个表只能有最多一个聚簇索引

begin;

CREATE TABLE tbl ( a int not nul1, b text not null);call set_table_property ( 'tbl', 'clustering_key ', 'a ' );commit;

--适合的查询

select sum( a) from tbl where a > 100 and a < 200;

(4)分段键设置

l .Segment_key 指定一些列(例如,时间列)作为分段键,当查询条件包含分段列时,查询可以通过segment_key快速找到相应数据对应的存储位置,segment_key要求按照数据输入自增

l 一般只有时间类型的字段(timestamptz)适合设置为 segment_key,其他场景基本不需要设置

l 只有列存表支持分段键盘

begin;

create table tbl ( a int not null, ts timestamp not null) ;call set_table_property ( 'tbl ', 'segment_key ' , 'ts ' );

commit;

--适合的查询

select sum( a) from tbl where ts : '2020-01-01' and ts < '2020-03-02 ' ;

(5)比特编码列设置

l bitmap_columns 指定比特编码列,Hologres 在这些列上构建比特编码。bitmap 可以对 segment 内部的数据进行快速过滤,所以建议用户把 filter 条件的数据建成比特编码

l 默认所有 text 列都会被隐式地设置到 bitmap_columns 中

l 只有列存表支持比特编码列

begin;

create table tbl ( a int not null, b text not null );call set_table_property ( 'tbl', 'bitmap_columns ', 'a ' ) ;commit;

--适合的查询

select * from tbl where a = 100;

(6)字典编码列设置

 dictionary_encoding_columns 指定字典编码列,Hologres 为指定列的值构建字典映射。字典编码可以将字符串的比较转成数字的比较,加速 group by 查询,建议用户将 group by 的字段都建成

dictionary_encoding_columns

默认所有text列都会被隐式地设置到

dictionary_encoding_columns

l 不建议将基数高的列建为dictionary_encoding_columns会导致查询性能变差

l 只有列存表支持字典编码列

begin;

create table tbl (a int not null, b text not null ) ;

call set_table_property( 'tbl ', 'dictionary_encoding_columns ', 'b ');commit;

---适合的查询

select sum( a) from tbl group by b;

(7)分布键设置

 Hologres 中,数据库表默认为随机分布形式。数据将被随机分配到各个 shard 上。如果用户制定了分布列,数据将按照指定列,将数据 shuffe 到各个 shard,同样的数值肯定会在同样的 shard 中。当用户以分布列做过滤条件时,Hologres 可以直接筛选出数据相关的 shard 进行扫描。当用户以分布列做 join 条件时,Hologres 不需要再次将数据 shuffe 到其他计算节点,直接在本节点 join 本节点数据即可,可以大大提高执行效率。同时如果用户 group by 的 key 是分布列也可以减少━次数据 shuffle

l pk 的表,默认是 pk,可以指定 pk 字段的子集,不能随意指定

l 用户可以通过 shard_count 来指定表的 shard 数,如果不指定每个数据库都有一个默认的 shard 数。一旦用户指定了一个表的 shard 数,其他的表如果想要和这个表做 local join 必须指定 colcate with 这个表

begin ;

create table tmp( a int, b int, c int ) ;

call set_table_property ( 'tmp ' , 'distribution_key ' , 'a ' ) ;c ommit;

begin ;

create table tmp1(a int, b int, c int) ;

call set_table_property ( 'tmp1 ' , 'distribution_key ', 'b');commit;

select count(1) from tmp join tmp1 on tmp.a = tmp1.b --将分布列设为 join key

(8)数据生命周期管理

time_to_live_in_seconds 指定了表数据的生存时间,单位为秒,必须是非负数字类型

表数据的TTL并不是精确的时间,当超过设置的 TTL 后,系统会在某一个时间自动删除表数据,所以业务逻辑不能强依赖 TTL

begin;

create table tbl ( a int not null,b text not null) ;

call set_table_property( 'tbl', 'time_to_live_in_seconds ', '3.14159');commit;

begin;

create table tbl ( a int not null, b text not null) ;

call set_table_property ( 'tbl', 'time_to_live_in_seconds ' , '86400 ' );commit;

 

八,性能调优实操演示

1),通过 explain 查看执行计划

>select * from tmp1;

>select count(1) from tmp1;

>select count(2) from tmp2;

>explain select count(2) from tmp1 join tmp2 on tmp1.a = tmp2.a;

>\timing

>select count(1) from tmp1 join tmp2 on tmp1.a = tmp2.a;

2),执行 analyze,生成统计信息

>analyze tmp1;

>analyze tmp2;

>explain select count(2) from tmp1 join tmp2 on tmp1.a = tmp2.a;

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
相关文章
|
SQL 运维 关系型数据库
分库分表至 Hologres 最佳实践 | 学习笔记
快速学习分库分表至 Hologres 最佳实践
|
SQL 消息中间件 Cloud Native
实时数仓实战|学习笔记
快速学习实时数仓实战
157 0
实时数仓实战|学习笔记
|
存储 缓存 分布式计算
HSAP 理念与 Hologres 设计原理(二)|学习笔记
快速学习HSAP 理念与 Hologres 设计原理(二)
124 0
HSAP 理念与 Hologres 设计原理(二)|学习笔记
|
SQL 数据采集 运维
《实时数仓助力互联网实时决策和精准营销》|学习笔记
快速学习《实时数仓助力互联网实时决策和精准营销》
236 0
|
机器学习/深度学习 消息中间件 存储
基于 Apache Flink + Hologres 的实时推荐系统架构解析|学习笔记
快速学习 基于 Apache Flink + Hologres 的实时推荐系统架构解析
587 0
基于 Apache Flink + Hologres  的实时推荐系统架构解析|学习笔记
|
存储 分布式计算 Cloud Native
Hologres 总体架构|学习笔记
快速学习 Hologres 总体架构
442 0
Hologres 总体架构|学习笔记
|
消息中间件 DataWorks Oracle
Hologres 数据导入/导出实践|学习笔记
快速学习 Hologres 数据导入/导出实践
448 0
Hologres 数据导入/导出实践|学习笔记
|
数据可视化 关系型数据库 MySQL
实时数仓分层 | 学习笔记
快速学习实时数仓分层
567 0
实时数仓分层 | 学习笔记
|
SQL 关系型数据库 Apache
如何使用实时计算 e2e 搭建实时数仓(上)+(下)|学习笔记
快速学习 如何使用实时计算 e2e 搭建实时数仓(上)+(下)
229 0
|
数据采集 弹性计算 运维
实时数仓助力互联网实时决策和精准营销|学习笔记
快速学习 实时数仓助力互联网实时决策和精准营销
217 0
下一篇
无影云桌面