报错1:
DB::Exception: There is no supertype for types Int32, String because some of them are String/FixedString and some of them are not
翻译如下:
没有Int32超类型,因为它们中的一些是String/FixedString,一些不是。
原因和解决方案:
如果a字段是int32,我们查询
select ifNull(a,'') from mytest;
这样就会报这个错,这个是因为ifNull或者其他函数处理的时候给默认值只能给相同字段的同一类型的默认值,否则就会报类似这种错。
解决方案如下:
select ifNull(a, 0) from mytest;
在union all中也会经常出现这个报错,因为虽然字段可能是一样,但是字段类型不一样,也会报这样的错误。
报错2:
Multiple JOIN do not support asterisks for complex queries yet
翻译如下:
对于复杂的查询,多个JOIN还不支持星号
原因和解决方案:
涉及到join超过2个以上的sql,需要读里面的数据需要指定列。
报错3:
DB::Exception: Invalid status for associated output..
翻译如下:
DB::Exception:关联输出的无效状态..
原因和解决方案:
union all只能支持最多三个,超过三个以上的union all则会报此错误
报错4:
Memory limit (for query) exceeded: would use 9.38 GiB (attempt to allocate chunk of 135439453 bytes), maximum: 9.31 GiB
翻译如下:
内存超限制
原因和解决方案:
原因:
1:多用户并发执行,每个用户查询的数据量都很大,导致了总体超过了内存限制,导致了溢出
2:group by单语句问题 ClickHouse会限制group by使用的内存量(它使用 hash table来处理group by)
3:insert 语句也可能导致 内存溢出问题,调整参数
解决方案:
在内存足够情况下:
SET max_memory_usage = 128000000000; #128G
内存不足情况下:
set max_bytes_before_external_group_by=20000000000; #20G,默认值为0,表示在GROUP BY中启动将临时数据转存到磁盘上的内存阈值。
# 使用max_bytes_before_external_group_by时,建议将max_memory_usage设置为它的两倍。这是因为一个聚合需要两个阶段来完成:
#(1)读取数据并形成中间数据
#(2)合并中间数据。临时数据的转存只会发生在第一个阶段。
# 如果没有发生临时文件的转存,那么阶段二将最多消耗与1阶段相同的内存大小。
set max_memory_usage=40000000000; #40G
报错5:
DB::Exception: Cannot UPDATE key column `user_id`.
翻译如下:
不能更新索引列
原因和解决方案:
索引列不能进行更新
报错6:
DB::Exception: Mutations are not supported by storage Distributed
翻译如下:
mutation是不支持distributed引擎存储
原因和解决方案:
分布式表不能进行更新