开发者学堂课程【实时数仓 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;