系统运维系列 之Clickhouse数据库学习集锦(接查询优化问题整理)

1 简介

ClickHouse是一个用于联机分析 (OLAP)的列式数据库管理系统(DBMS),来自于俄罗斯本土搜索引擎企业 Yandex 公司,是为世界第二大web分析平台(Yandex.Metrica)所开发2016年开源,开发语言是C++,是一款PB级的交互式分析数据库。ClickHouse的性能超过了目前市场上可比的面向列的DBMS,每秒钟每台服务器每秒处理数亿至十亿多行和数十千兆字节的数据。

OLAP介绍:
OLAP技术主要通过多维的方式来对数据进行分析、查询和生成报表,它不同于传统的OLTP处理应用。OLTP应用主要是用来完成用户的事务处理,如民航订票系统和银行的储蓄系统等,通常要进行大量的更新操作,同时对响应的时间要求比较高。而OLAP系统的应用主要是对用户当前的及历史数据进行分析,扶助领导决策,其典型的应拥有对银行信用卡风险的分析与预测和公司市场营销策略的制定等,主要是进行大量的查询操作,对时间的要求不太严格。
OLAP特性:
快速性:用户对OLAP的快速反应能力有很高的要求;
可分析性:OLAP系统应能处理与应用有关的任何逻辑分析和统计分析;
维性:多维性是OLAP的关键属性;
信息性:OLAP系统应能及时获得信息,并且管理大容量信息。

DBMS介绍:
数据库管理系统(Database Management System,DBMS)是一种操纵和管理数据库的大型软件。
DBMS的种类:
层次数据库(Hierarchical Database, HDB):
将数据通过树形结构的方式表现出来;
关系数据库(Relational Database, RDB):
是现在应用最广泛的数据库,采用由行和列组成的二维表来管理数据;
面向对象数据库(Object Oriented Database, OODB):
面向对象语言的语言将数据以及对数据的操作集合起来以对象为单位进行管理,面向对象数据库就是用来保存这些对象的数据库;
ML数据库( XML Database, XMLDB);
键值存储系统( Key-Value Store, KVS)

2 多样化引擎
数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

MergeTree:
存储的数据按主键排序;
如果指定了分区键的话,可以使用分区。在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快;
支持数据副本。 ReplicatedMergeTree 系列的表提供了数据副本功能。

--MergeTree建表语句
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
name2 [type] [DEFAUErEMAMLERLALLIZED|ALIAS expr],
省略...
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, 省略...]

TinyLog:
TinyLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能;
TinyLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中;
它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描述符。

--创建TinyLog引擎表
create table t_tinylog (id String, name String) engine=TinyLog;

3 Sql操作
Insert:

常规插入 insert into [table_name] values(),()
从表到表的插入 insert into [table_name] select a,b,c from [table_name_2]

Update和Delete:
每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区。所以尽量做批量的变更,不要进行频繁小数据的操作。

删除操作 alter table t_order_smt delete where id = '001';
--Mutation 语句分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间,(一般不会开放这样的功能给用户,由管理员完成)。
修改操作 alter table t_order_smt update total_amount=toDecimal32(2000.00,2) where id = '102'; 

Select:

支持子查询;
支持 CTE(Common Table Expression 公用表表达式 with 子句);
支持各种 JOIN,但是 JOIN 操作无法使用缓存,所以即使是两次相同的 JOIN 语句,ClickHouse 也会视为两条新SQL

Alter:

新增字段 alter table tablename add column newcolname String after colold '';
修改字段类型 alter modify;
删除字段 alter drop

4 异常处理

DB::Exception: Nested type Array(String) cannot be inside Nullable type (version 20.4.6.53 (official build))
原因:字段类型是Nullable(String),在使用一些字符串函数如splitByString,他们对Nullable类型是不支持的,需要转成String。
解决:使用cast强转一下字段类型就行:
select splitByString(',',cast(col as String)) col from test;
DB::Exception: Memory limit (total) exceeded: would use 113.20 GiB (attempt to allocate chunk of 134200512 bytes), maximum: 113.14 GiB: While executing CreatingSetsTransform. (version 20.4.6.53 (official build)
原因:单次查询出来的数据量,大于单台机器的剩余内存。
解决:可以将查询范围缩小,比如添加查询条件对查询结果取余,也可以清理或者添加物理机内存;具体查询优化可参考上一篇博客文章。
http read timeout
在JDBC properties 中设置 socket_timeout
Properties properties = new Properties();
properties.put("socket_timeout", TimeUnit.SECONDS.toMillis(JDBC_SESSION_TIMEOUT_SECONDS));

5 数据类型

1.整型:UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64
范围U开头-2N/2~2N-1;非U开头02^N-1
2.枚举类型:Enum8,Enum16
Enum('hello'=1,'test'=-1),Enum是有符号的整型映射的,因此负数也是可以的
3.字符串型:FixedString(N),String
N是最大字节数,不是字符长度,如果是UTF8字符串,那么就会占3个字节,GBK会占2字节;String可以用来替换VARCHAR,BLOB,CLOB等数据类型
4.时间类型:Date
5.数组类型:Array(T)
T是一个基本类型,包括arry在内,官方不建议使用多维数组
6.元组:Tuple
7.结构:Nested(name1 Type1,name2 Type2,...)
类似一种map的结构

参考资料:
https://blog.csdn.net/weixin_39025362/article/details/116595240?spm=1001.2101.3001.6650.11&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-11.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-11.pc_relevant_paycolumn_v3&utm_relevant_index=18 ClickHouse (十六)异常处理总结
https://blog.csdn.net/u013490585/article/details/86605350 clickhouse 基础知识

你可能感兴趣的:(基础运维,pagefile.sys,Clickhouse数据库,数据库,学习集锦)