也可在PC端打开 https://developer.aliyun.com/topic/download?id=961 下载
一、实例购买与管理
(一)购买Hologres
进入阿里云官网,大家搜索交互式分析产品或者Hologres,就可以进入到产品详情界面,点击立刻购买,就会进入到产品的购买页面;在产品购买页面中我们需要输入实例名称,然后根据实际需求和填写选择商品类型、地域等信息,即可以完成购买。
(二)管理实例
实例购买完成之后,我们可以在阿里云界面上点击管理控制台进入Hologres管控台。Hologres管控台是专属用于管控Hologres实例,如下图(左)所示。我们可以在管控台查看购买的实例详详情,还可以针对每一个实例进行实例内对象管控,例如新建DB、授权用户等,同时管控台还提供监控告警指标,方便您对实例运行情况做更加细致的管控。整个管控台的界面清晰明了,简单易用,对新手小白也非常的友好,易上手。
二、SQL 开发教程
在学习Hologres SQL的使用之前我们需要了解Hologres实例内的相关概念:
- 实例:使用和管理数据库存储服务的实体,一个实例可以看作是多个数据库的合集。
- 数据库:一个模式的合集,用户所有的操作,包括表、函数等都是在数据库中完成的。系统会在用户完成实例申请后默认创建一个“postgres”的数据库,该DB仅用于运维管理,实际业务需要新建DB。
- 表:表是数据存储的单元。它在逻辑上是由行和列组成的二维结构,列的数量和顺序是固定的,并且每一列拥有一个名字;行的数目是变化的,它反映了在一个给定时刻表中存储的数据量。
- 外表:外表是数据实际存储在其他系统里,但是通过Hologres来访问的一类表。Hologres完全兼容postgres的Foreign Data Wrapper,目前使用外表的方式支持直接访问MaxComputer中的数据,加速查询。
(一)连接开发工具
Hologres是一个完全兼容Postgres生态的产品,因此原则上任何能够直接访问Postgres的工具都能够直接连接Hologres,比如JDBC、ODBC等工具。同时,Hologres也提供了HoloStudio、HoloWeb等开发平台,方便用户根据不同的业务需求连接Hologres编写SQL任务,加快开发过程。
(二)Hologres SQL
Hologres SQL目前兼容开源的PostgresSQL 11,因此用户可以参照Postgres官方文档来编写查询任务,另外,若是在开发过程如果遇到一些问题,也可以很容易的从搜索引擎上找到问题答案。
当前Hologres并未完全兼容Postgres,以下将会介绍Hologres已经兼容的重点SQL语法和功能等。
(1)创建表
Hologres建表的语句是PG(Postgres)的一个子集,使用起来非常方便,一个简单的创建表的例子如下图所示。
(2)分区表的创建
分区表方便管理数据,并能通过分区裁剪来加快数据的查找。Hologres中分区表的创建依然兼容Postgres语法,使用简便,但是有以下几点注意事项:
- 不能向父表中插入任何数据;
- 只有 text/varchar 类型才能作为分区键;
- Partition by类型仅支持list,切分Partition list只能有一个值;
- 分区表的数据不会自动删除,需要用户自己管理生命周期。
下图是一个创建分区表的示例:
(3)数据类型
目前Hologres支持大部分Postgres支持的数据类型,如下图所示,并且Hologres支持的数据类型在不断的增加,以便能够满足大家更多的场景需要。关于数据类型的支持情况,可以参考文档数据类型。
(4)存储属性设置
Hologres与标准Postgres语法在属性设置是不同的。这种属性设置类似其他数据库中的索引,通过合理的设置索引来达到加速查询的效果。
Hologres目前通过设置set_table_property语法来指定表的额外属性,合理设置table property对于查询的性能影响极大,但是我们需要注意set_table_property的调用需要create table在同一事务中执行,且set_table_property对于同一个key不能重复调用,下面将会来仔细介绍在Hologres中属性的设置以及其适用场景和使用限制。
(1)存储类型设置
Hologres目前支持按行存储和按列存储两种存储类型,我们可以通过orientation来指定存储类型。行存适用于高QPS的基于primary key的点查询,例如where pk=abc,其余场景都应该选用列存方式。下图是两个相应的例子。
(2)聚簇索引 Clustering Key
聚簇键类似于传统数据库中的聚簇索引。如果用户设置了clustering key,指定一些列作为聚簇索引,Hologres 会在指定的列上将建立聚簇索引,并且在聚簇索引上对数据进行排序。建立聚簇索引能够加速用户在索引列上的range和filter查询。
- clustering key创建的时候数据类型不能为float/double,
- 每个表最多只能有一个clustering key。
(3)分段键Segment key
聚簇索引主要是对数据进行排序,而分段键Segment key主要是用来帮助Hologres进行一些文件的快速筛选和跳过。用户可以通过设置Segment key 指定一些列(例如,时间列)作为分段键,当查询条件包含分段列时,查询可以通过segment key快速找到相应数据对应的存储位置。
- segment key要求按照数据输入自增,一般只有时间类型的字段(timestamptz)适合设置为segment key,其他场景基本不需要设置
- 只有列存表支持分段键设置。
(4)比特编码列bitmap columns
比特编码列bitmap columns 也是对Hologres性能来说非常重要的一个属性,通过bitmap_columns 指定比特编码列,Hologres 会在这些列上构建比特编码,相当于把数据与对应的行号做一个映射。
- bitmap可以对segment内部的数据进行快速过滤,因此建议把filter条件的数据建成比特编码。
- 目前Hologres会默认所有text列都会被隐藏式地设置到bitmap_columns中,
- 但是只有列存表支持比特编码列。
(5)字典编码列设置
字典编码主要是对一些字符串类型的列生成字典编码。用户通过设置dictionary_encoding_columns 指定字典编码列,Hologres将为指定列的值构建字典映射。字典编码可以将字符串的比较转成数字的比较,加速group by查询,因此建议用户将group by的字段都建成dictionary_encoding_columns,但是不建议将基数高的列建为dictionary_encoding_columns,会导致查询性能变差。Hologres默认所有 text 列都会被隐式地设置到 dictionary_encoding_columns中,另外需要注意只有列存表支持字典编码列。
(6)分布键distribution key
Hologres是一个分布式的计算引擎,如果没有设置分布键,数据库表默认为随机分布形式,数据将被随机分配到各个shard上;如果用户指定了分布列,数据将按照指定列,将数据shuffle到各个shard,同样的数值肯定会在同样的shard中。
当用户以分布列做过滤条件时,Hologres可以直接筛选出数据相关的shard进行扫描;当用户以分布列做join条件时,Hologres不需要再次将数据shuffle到其他计算节点,直接在本节点join本节点数据即可,可以大大提高执行效率;同时如果用户group by的key是分布列也可以减少一次数据shuffle,对整个查询的性能带来非常大的提升。
- 对于有pk的表,其分布键默认就是pk,如果不想pk字段作为分布键,可以指定pk字段的子集,但是不能随意指定。
- 可以通过shard_count来指定表的shard数,如果不指定的话每个数据库都有一个默认的shard数, 一旦指定了一个表的shard数,其他的表如果想要和这个表做local join,就必须指定colcate with这个表。下图所示是一个通过分布键设置来加速两个表做join的场景。
(7)数据生命周期管理time_to_live_in_seconds
Hologres目前提供了time_to_live_in_seconds来帮助管理数据的生命周期,其默认单位是秒,必须是非负数字类型。
表数据的TTL并不是精确的时间,当超过设置的TTL后,系统会在某一个时间自动删除表数据,因此业务逻辑不能强依赖TTL,以免带来不必要的损失。
三、性能调优
下面是一个两个表关联查询的优化案例。这里我们有tmp1和tmp2两个表,其中temp1有1000条记录,temp2有1亿条记录,两个表join查询的query如下:
select count(1) from tmp1 join tmp2 on tmp1.a = tmp2.a
在查询之前,我们通过explain来查看执行计划,如下图所示:
通过查看执行计划,我们可以对整个查询过程更加了解,发现其中可以进行优化的地方,比如从上图可以看出整个查询计划并没有拿到表的相应统计信息,这种情况下会导致整个查询计划性能较差。
通过实验,上面的查询计划在不进行调优的情况下整个过程需要约8.5秒的时间。接下来我们通过analyze来帮助Hologres生成优化器需要的统计信息,其操作非常简单,只需要执行如下两行命令即可:
analyze tmp1;
analyze tmp2;
在生成了统计信息之后我们再次通过explain查看执行计划:
从上图中可以看到,在analyze之后,整个查询计划已经发生了改变:
- 更新了整个表的真实行数,并且对整个查询计划做了相应调整;
- join顺序从tmp1 join tmp2变成了tmp2 join tmp1,降低了资源消耗。
在经过上面的优化之后,再次执行相同的查询,发现整个查询过程只用了500ms,整个查询性能大大提升,而我们所做的操作也仅仅是生成了整个表的查询信息,就获得了10倍以上的优化效果。这也说明整个查询的统计信息对查询性能有着至关重要的影响,因此大家今后在导入数据之后可以生成一下统计信息,以便更好的执行查询计划。
更多关于性能调优的方式,大家可以参考文档性能调优。
关键词:Hologres,实时数仓,Postgres,PostgreSQL