clickhouse官方文档:https://clickhouse.com/docs/zh/sql-reference/data-types/decimal
一,建表
create table acitivity_user_record
(
id String DEFAULT generateUUIDv4(), -- 主键自增
activityId String,
userId String,
userName Nullable(String),
phoneNumber Nullable(String),
companyName Nullable(String),
companyAddr Nullable(String),
`source` Nullable(String),
`platform` Nullable(String),
addDate UInt64,
addDateTime DateTime64(3)
)
engine = ReplacingMergeTree PARTITION BY activityId
PRIMARY KEY (id)
ORDER BY (id, addDateTime, activityId)
SETTINGS index_granularity = 8192;
(1)表引擎
ReplacingMergeTree 具有去重功能,数据存储在磁盘上
Memory引擎数据可能会重复,数据存储在内存中,查询会更快,但是数据容易丢失,如果服务器挂掉,数据就丢失了。
在idea使用表的拷贝功能,将表从一个库拷贝到另一个库的时候,表引擎自动变为memory,服务器重启数据就丢失了。
如果不指定PRIMARY KEY会把order by指定的字段作为主键
order by用于对分区内的数据进行排序
二,遇到的一些问题
1,语法上和mysql,sqlserver上有差异
1,分区字段,排序字段不支持update,只能删除再插入
2,Nullable类型的字符串字段,很多字符串的函数不能用,嗯,试试就知道了
3,clickhouse在进行算数运算和比较运算时默认会进行精度检查
例如decaimal类型相乘,
例如amout和tax_cost_price都是Decimal(18,6) 类型的,amout*tax_cost_price相乘之后小数部分位数会相加,变成Decimal(18,12),精度溢出报错
得先进行精度转换multiply(toDecimal64(sbd.amount, 5), toDecimal64(sbd.tax_cost_price, 5)
检查溢出会导致计算变慢。如果已知溢出不可能,则可以通过设置decimal_check_overflow来禁用溢出检查,在这种情况下,溢出将导致结果不正确,官方文档里描述的很详细,还有示例
4,clickhouse多表关联查询时性能很差,之前在查销售流向的时候使用了五张表进行关联查询,其中两张销售表的数据量特别大,进行关联聚合查询时执行了1分多钟,改为子查询之后执行时间只需要六七秒。
线上之前用sqlserver需要14~17s的查询,改成clickhouse只需要两三秒了,数据量是三千多万。