Hologres笔记

Hologres笔记

一、常用命令

-- 创建内部表
begin;
create table [if not exists] [schema_name.]table_name(
	id bigint primary key,
    b text,
    ds text,
)
partition by list(ds);
commit;

-- 创建子表
create table if not exists table_name_date_202101 partition of table_name for values in ('202101');

-- 创建外部表
CREATE FOREIGN TABLE odps_students (
	id bigint,
    b text,
    ds text,
)
SERVER odps_server
OPTIONS (project_name 'public_data', table_name 'oracle2odps_cust');

-- 删除表	
DROP TABLE [ IF EXISTS ] table_name [, ...];

-- 删除外部表
DROP FOREIGN TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

-- 修改表名
ALTER TABLE table_name RENAME to new_table_name;

-- 修改外部表名
ALTER FOREIGN TABLE [ IF EXISTS ] name RENAME TO new_name;

-- 增加列
ALTER TABLE IF EXISTS table_name ADD COLUMN new_column_name data_type; 
ALTER TABLE IF EXISTS table_name ADD COLUMN col_add_1 data_type, ADD COLUMN col_add_2 TEXT IF NOT EXISTS col_add_2 data_type;

-- 给表增加注释
COMMENT ON TABLE table_name IS 'my comments on table table_name.';

-- 给列增加注释
COMMENT ON COLUMN table_name.col1 IS 'This my first col1';

-- 给外部表增加注释
COMMENT ON FOREIGN TABLE foreign_table IS ' comments on my foreign table';

-- 查询执行计划
explain querysql;

-- 查询表所在的组名
select property_value from hologres.hg_table_properties where table_name = '表名' and property_key = 'table_group';

-- 查询对应表组的shard count
select * from hologres.hg_table_group_properties where tablegroup_name = '组名' and property_key = 'shard_count';
-- 获取当前用户Account ID
SELECT current_user;

-- 获取当前用户的阿里云显示名称
SELECT user_display_name(current_user);

-- 获取所有用户的阿里云显示名称
SELECT user_display_name(rolname) FROM pg_roles;
-- UNION 
返回位于一个或者两个结果集中的全部行

-- INTERSECT
返回同时位于两个结果集中的所有行

-- EXCEPT
返回位于第一个结果集但不在第二个结果集中的行

注:在所有三种情况下,重复行都会被消除(除非指定ALL)。

二、索引

2.1 存储类型设置
call set_table_property('table1','orientation','[row|colume]');

行存适用于高QPS的基于primary key的点查询,例如where pk=abc,其余场景都应该选用列存方式。
2.2 聚簇索引 Clustering key
call set_table_property('table1','clustering_key','a');
or 
call set_table_property('tbl', 'clustering_key', 'a:desc,b:asc');

对建立索引数据进行排序,建立聚簇索引能够加速用户在索引列上的range和filter查询
例:select sum(a) from table1 where a > 100 and a < 200;
注:descasc表名构建索引时的排序方式,默认为asc。clustering key创建的时候数据类型不能为float/double,每个表最多只有一个clustering key
2.3 分段键Segment Key
call set_table_property('table1','segment key','ds');

分段键帮助Hologres进行一些文件的快速筛选和跳过。指定分段键,当查询条件包含分段列时,查询可以通过segment key快速找到相应数据对应的存储位置。
例:select sum(a) from table1 where ts > '2020-01-01' and ts < '2020-03-02'
注:segment key要求按照数据输入自增,一般只有时间类型的字段(timestamptz)适合设置为segment key,其他场景基本不需要设置。只有列存表支持分段键设置。
2.4 比特编码列bitmap columns
call set_table_property('table1','bitmap key','ds');

指定比特编码列使Hologres会在这些列上构建比特编码,相当于把数据与对应的行号做一个映射
例:select * from table1 where a = 100;
注:bitmap可以对segment内部的数据进行快速过滤,因此建议把filter条件的数据建成比特编码。目前Hologres会默认所有text列都会被隐藏式地设置到bitmap_columns中。但是只有列存表支持比特编码列
2.5 字典编码列设置
call set_table_property('table1','dictionary_encoding_columns','b');

字典编码可以将字符串的比较转换成数字的比较,加速group by查询
例:select sum(a) from table1 group by b;
注:不建议将基数高的列建为字典编码列,会导致查询性能变差。目前Hologres会默认所有text列都会被隐藏式地设置到bitmap_columns中。但是只有列存表支持比特编码列
2.6 分部键distribution key
call set_table_property('table1','distribution key','b');

指定分布列,数据将按照指定列,将数据shuffle到各个shard,同样的数值肯定会在同样的shrad中。
例:select count(1) from tmp1 join tmp2 on tmp1.a = tmp2.b
注:对于有pk的表,其分布键默认就是pk,如果不想pk字段作为分布键,可以指定pk字段的子集,但是不能随意指定。
	可以通过shard_count来指定表的shard数,如果不指定的话每个数据库都有一个默认的shard数,一旦指定了一个表的shard数,其他的表如果想要和这个表做local join,就必须指定colcate with这个表。
2.7 数据生命周期管理time_to_live_in_seconds
call set_table_property('table1','time_to_live_in_seconds','96400');

管理数据的声明周期,默认时间是秒,必须是非负数字类型。表数据的TTL并不是精确的时间,当超过设置的TTL后,系统会在某一个时间自动删除数据,因此业务逻辑不能强依赖TTL,以免带来不必要的损失时

三、函数

1、常用函数
2、函数转换
1.nullif(num,0)
如果num为null就显示为0,不为空就显示为num

2.cast(num as bigint) 
将num转换成bigint类型