ClickHouse的基础类型只有数值、字符串和时间三种类型。
1)Int
分类 | 名称 | 大小(字节) | 范围 | java |
---|---|---|---|---|
有符号整数类型 | Int8 | 1 | -(2^7)到2^7-1 | byte |
Int16 | 2 | -(2^15)到2^15-1 | short | |
Int32 | 4 | -(2^31)到2^31-1 | int | |
Int64 | 8 | -(2^63)到2^63-1 | long | |
无符号整数类型 | UInt8 | 1 | 2^8 | - |
UInt16 | 2 | 2^16 | - | |
UInt32 | 4 | 2^32 | - | |
UInt64 | 8 | 2^64 | - |
2)Float
名称 | 大小(字节) | 精度 | java |
---|---|---|---|
Float32 | 4 | 7 | float |
Float64 | 8 | 16 | double |
3)Decimal
在使用Float浮点数进行运算时,精度是有限的, 如果写入超过了有效精度的数值,则会出现数据误差,因此此时需要使用定点数。原生声明方式为Decimal(P, S)
有三种简写方式:
简写 | 等效声明 | 范围 |
Decimal32(S) | Decimal(1~9, S) | -(10^(9-S))到10^(9-S) |
Decimal64(S) | Decimal(10~18, S) | -(10^(18-S))到10^(18-S) |
Decimal128(S) | Decimal(19~38, S) | -(10^(38-S))到10^(38-S) |
1)String
特点:
2)FixedString
类似传统数据库的char类型,如果字符串实际长度不满足限制长度,在末尾用空字符串填充
3)UUID
格式为8-4-4-4-12的字符串,如果在写入时未赋值,则依照格式用0填充
类型 | 精度 |
DateTime | 秒 |
DateTime64 | 亚秒 |
Date | 日期 |
复合类型有四种:数组、元组、枚举、嵌套。
1)Array 声明方式有两种,如下:
- SELECT array(1,2) as aa, toTypeName(aa);
-
- SELECT [1,2] AS aa, toTypeName(aa);
-
- -- DDL定义
- CREATE TABLE ARRAY_TEST( \
- C1 Array(String) \
- ) engine = Memory;
2)Tuple,元组是由多个元素组成的一个数据集,多个元素的类型可以不同,声明方式如下:
- SELECT tuple(1, 'a', now()) AS aa, toTypeName(aa);
-
- SELECT (1, 2.01, null) as aa, toTypeName(aa);
-
- -- DDL定义
- CREATE TABLE TUPLE_TEST( \
- C1 Tuple(String, Int8) \
- ) engine = Memory;
3)Enum,枚举类型即键值对,提供了Enum8和Enum16两种枚举类型,声明方式如下:
- -- DDL定义
- CREATE TABLE ENUM_TEST( \
- C1 Enum8('ready'=1, 'start'=2, 'success'=3, 'error'=4) \
- ) engine = Memory;
-
- INSERT INTO ENUM_TEST values ('ready');
-
- INSERT INTO ENUM_TEST values ('start');
-
- SELECT * FROM ENUM_TEST WHERE C1=1;
- SELECT * FROM ENUM_TEST WHERE C1='start';
枚举固定使用Key->Int(String -> Int)进行定义,定义的Key是String类型,但是在对其进行操作时,会使用Int类型的Value进行操作。
4)Nested,嵌套类型,特点:
- -- DDL
- CREATE TABLE NESTED_TEST( \
- name String, \
- age UInt8, \
- dept Nested( \
- id UInt16, \
- name String \
- ) \
- ) ENGINE = Memory;
-
- INSERT INTO NESTED_TEST VALUES ('nauu', 18, [1000], ['测试中心']);
- INSERT INTO NESTED_TEST VALUES ('amy', 18, [1000, 1001], ['测试中心', '研发中心']);
-
- select name, age, dept.id from NESTED_TEST;
类型 | 说明 |
Nullable | Null值的声明 |
IPv4 | 通过UInt32存储IPv4,并且自动进行数据校验 |
IPv6 | 通过FixedString(16)存储IPv6,自动进行校验 |
CREATE DATABASE IF NOT EXISTS DB_NAME [ENGINE = engine]
数据库支持设置引擎,目前支持5中引擎:
- CREATE TEMPORARY TABLE [IF NOT EXISTS] TABLE_NAME (
- NAME1 [TYPE],
- NAME2 [TYPE],
- )
特点:
数据分区是针对本地数据的纵向切分,借助数据分区,可以在查询时跳过不必要的数据目录,从而提升性能。数据分区不宜粒度太细,会使得分区数量急剧增长,从而导致性能下降。
创建分区表语法:
- CREATE TABLE partition_v1( \
- ID String, \
- URL String, \
- EventTime Date \
- ) ENGINE = MergeTree() \
- PARTITION by toYYYYMM(EventTime) \
- ORDER BY ID;
-
- -- 插入数据
- INSERT INTO partition_v1 VALUES \
- ('A000', 'www.baidu.com', '2019-05-01'), \
- ('A001', 'www.qq.com', '2019-06-02');
-
- -- 查询分区状态
- SELECT table, partition, path from system.parts WHERE table = 'partition_v1';
ClickHouse类似Oracle有普通和物化两种视图,物化视图拥有独立的存储。
创建物化视图语法:
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [DB.]TABLE_NAME [TO [DB.]NAME] [ENGINE=engine] [POPULATE] AS SELECT * FROM ...
ClickHouse物化视图特点:
select partition_id,name,table, database from system.parts where table = 'partition_v1';
如上图,partition_v1表共有2个分区,其中partition_id和name可以作为分区信息的联合主键。
- alter table partition_v1 drop partition 201905;
-
- select partition_id,name,table, database from system.parts where table = 'partition_v1';
如上图,删除分区后,通过sql查询分区信息,已经不能查到被删除的分区,同时数据目录中也没有对应的分区目录。
- -- 复制分区数据
- alter table partition_v2 replace partition 201908 from partition_v1;
-
- -- 重置分区数据,清空URL列
- alter table partition_v2 clear column URL in partition 201908;
复制分区数据条件:
复制分区数据场景:
复制分区数据可以用于快速数据写入,多表建数据同步和备份。则可以用于如历史数据迁移之类的场景。
- -- 卸载分区
- alter table partition_v1 detach partition 201906;
-
- -- 装载分区
- alter table partition_v1 attach partition 201906;
装载分区和卸载分区是一对伴生操作。
卸载分区,会将物理数据转移到数据表目录的detached子目录下,而装载分区是其反向操作。一旦分区被移动到detached ,则脱离了ClickHouse的管理,但是数据文件会一直存在。