以下sql中 select bitmapBuild([1,2,3,4]) 代表不同的表查询得到的bitmap结果
单节点查询正常
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapBuild([1,2,3,4]) ) as u3,
(select bitmapBuild([1,2,3,4]) ) as u4,
(select bitmapBuild([1,2,3,4]) ) as u5,
(select bitmapAnd(bitmapAnd(bitmapAnd(bitmapAnd(u1,u2),u3),u4),u5) ) as u
select bitmapCardinality(u)
放在集群里面
select sum(b) from cluster('ck_rep2',
view(
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapBuild([1,2,3,4]) ) as u3,
(select bitmapBuild([1,2,3,4]) ) as u4,
(select bitmapBuild([1,2,3,4]) ) as u5,
(select bitmapAnd(bitmapAnd(bitmapAnd(bitmapAnd(u1,u2),u3),u4),u5) ) as u
select bitmapCardinality(u) as b
)
)
;
报错
Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.34 GiB (attempt to allocate chunk of 4194320 bytes)
减少一个表查询
select sum(b)
from cluster('ck_rep2',
view(
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapBuild([1,2,3,4]) ) as u3,
(select bitmapBuild([1,2,3,4]) ) as u4,
(select bitmapAnd(bitmapAnd(bitmapAnd(u1,u2),u3),u4) ) as u
select bitmapCardinality(u) as b
)
)
;
Code: 168, e.displayText() = DB::Exception: AST is too big. Maximum: 500000: (after expansion of aliases) (version 21.8.10.19 (official build))
再减少一个表查询
select sum(b)
from cluster('ck_rep2',
view(
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapBuild([1,2,3,4]) ) as u3,
(select bitmapAnd(bitmapAnd(u1,u2),u3) ) as u
select bitmapCardinality(u) as b
)
)
;
Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.32 GiB (attempt to allocate chunk of 4194512 bytes), maximum: 9.31 GiB (version 21.8.10.19 (official build))
继续减少
select sum(b)
from cluster('ck_rep2',
view(
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapAnd(u1,u2) ) as u
select bitmapCardinality(u) as b
)
);
可以得到结果
我能理解这个clickhouse的一个bug吗,有哪位能解答一下为什么
引用 皆我百晓生 小程序回复内容作答:
根据您提供的信息,这可能是ClickHouse的一个限制或bug导致的问题,当在集群中执行复杂的查询时发生了内存限制错误。ClickHouse在处理大数据量时有一些内存限制,以避免溢出和性能问题。
当您在查询中增加更多的表或操作时,查询中涉及的数据和中间计算结果的大小会增长。当达到了ClickHouse可用内存的限制时,就会发生内存限制错误。
在您的情况中,当在集群中执行具有较大数据量和复杂操作的查询时,ClickHouse尝试分配超过其可用内存限制的内存块,因此导致内存限制错误。
解决此问题的一种方法是增加ClickHouse集群的可用内存,以容纳更大的查询。您可以尝试在ClickHouse配置中增加内存限制的设置,如max_memory_usage
。
另一种方法是优化您的查询,以减少内存使用量。您可以检查查询的条件和操作,看看是否有可以优化的地方,例如减少中间计算步骤、减少涉及的数据量等。此外,您还可以尝试将查询拆分为多个较小的查询并进行逐步操作,以减少内存使用量。
请记住,ClickHouse是一个非常强大和高性能的分布式数据库,但在处理大数据量时可能会有一些限制和挑战。因此,在使用ClickHouse时,了解其内存和资源限制,并进行适当的优化和调整非常重要。如果您的问题仍然存在,请考虑提供更具体的信息和示例,以便更深入地分析和理解您遇到的问题。
查询使用的表都是本地表,数据是按照人分片的,一个人的数据只会出现在一个节点。集群有10个节点。
单节点查询正常,集群查询我理解cluster view 会将查询分发到每个节点进行本地查询,
最后在提交节点汇总,我的理解中这样查询应该是可以是速度更快的,但实际执行中,
select sum(b)
from cluster('ck_rep2',
view(
with
(select bitmapBuild([1,2,3,4]) ) as u1,
(select bitmapBuild([1,2,3,4]) ) as u2,
(select bitmapBuild([1,2,3,4]) ) as u3,
(select bitmapBuild([1,2,3,4]) ) as u4,
(select bitmapAnd(bitmapAnd(bitmapAnd(u1,u2),u3),u4) ) as u
select bitmapCardinality(u) as b
)
)
;
类似这样的sql ,提交运行了,结果运行了将近6分钟,最后也没有跑出来结果,还把提交节点打满了,导致连接拒绝。