本文章是阅读 朱凯著的《ClickHouse原理解析与应用实践》的个人读书笔记总结,如有偏差与原著为主,只供学习参考,谢绝转载。
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)
About name
**C**lick Stream
Data Ware**H**ouse
数据类型
基础类型
数值类型
整数
浮点数
定点数
更改精度的数值运算
两种形式可以申明定点
1.简写方式
Decimal32(S)、Decimal64(S)、 Decimal128(S)
2.原生方式
Decimal(P,S)
·P代表精度,决定总位数(整数部分+小数部分),取值范围是1 ~38;
·S代表规模,决定小数位数,取值范围是0~P。
简写和原生方式对应关系
字符串
时间类型
复合类型
特殊类型
数据库
数据表
建表
常规建表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
省略… ) ENGINE = engine
create table if not exists db_name.table_name(
)
Enging=(,)
partition by
order by()
sample by
SETTINGS index_granularity = 8192
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/ods_balance_history', '{replica}')
PARTITION BY toYYYYMMDD(ds)
ORDER BY (hr, time, user_id, asset, business, btype, function)
SAMPLE BY user_id SETTINGS index_granularity = 8192
复制其他表建表
select建表
临时表temporary
临时表的优先级是大于普通表,当两张数据表名称相同的时候,会优先读取临时表的数据。
只支持Memory表引擎,如果会话结束,数据表就会被销毁;临时表不属于任何数据库,所以在它的建表语句中,既没有数据库参数也没有表引擎参数。
create temporary table if not exists db_name.table_name
关于字段定义
明确定义的数据类型优先于默认值的定义
表字段支持三种默认值表达式的定义方法,分别是DEFAULT、 MATERIALIZED和ALIAS。
虽然提供了三种,但除了DEFAULT,其他限制很多,不建议使用,建表时强烈推荐使用明确定义数据类型。
分区
数据分区(partition)和数据分片(shard)是完全不同的两个概念。数据分区是针对本地数据而言的,是数据的一种纵向切分。而数据分片是数据的一种横向切分。
目前只有合并树(MergeTree)家族系列的表引擎才支持数据分区。
分区规则
MergeTree数据分区的规则由分区ID决定
分区ID拥有四种规则:
1.不指定分区键:分区ID默认取名为all
2.使用整型:有符号整型和无符号整型,直接按照该整型的字符形式输出
3.使用日期类型,按照YYYYMMDD进行格式化后的字符形式输出。
4.其他类型:通过128位Hash算法取其Hash值作为分区ID的取值。
命名规则,分区目录的合并过程以及一级索引…略(6.3,6.4二级索引)
PARTITION BY toYYYYMMDD(ds)
分区键不应该使用粒度过细的数据字段。例如,按照小时分区,将会带来分区数量的急剧增长,从而导致性能下降。
复制指定分区
将A表的分区数据复制到B表
ALTER TABLE B REPLACE PARTITION 201907 FROM A
要求满足两个前提条件:
1.两张表需要拥有相同的分区键;
2.它们的表结构完全相同。
清除分区内某列数据 CLEAR COLUMN
没啥用的,将某一列数据全部清空改为默认值,很鸡肋的功能,反正我没用过
ALTER TABLE tb_name CLEAR COLUMN column_name IN PARTITION partition_expr
删除指定分区
在建表时设置月日期作为分区的话,可以删除整月
ALTER TABLE table_name DROP PARTITION 201907
卸载与装载分区-DETACH
分区被卸载后,它的物理数据并没有删除,而是被转移到了当前数据表目录的detached子目录下。
卸载:
ALTER TABLE tb_name DETACH PARTITION partition_expr
装载
ALTER TABLE tb_name ATTACH PARTITION partition_expr
记住,一旦分区被移动到了detached子目录,就代表它已经脱离了ClickHouse的管理,ClickHouse并不会主动清理这些文件。
备份与还原分区
视图
普通视图
不会存储任何数据
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name AS SELECT ...