1、子查询
SELECT bitmapAndCardinality(groupBitmapOrStateOrDefault(bitmap)) FROM test.group_bitmap WHERE code = '001' AND version = '001'
目的是查出符合条件的bitmap然后计算其容量,但实际执行过程中发现会扫描全表的bitmap,耗时相当高
优化后:
SELECT bitmapAndCardinality(groupBitmapOrStateOrDefault(bitmap)) FROM (
SELECT bitmap FROM test.group_bitmap WHERE code = '001' AND version = '001' LIMIT 1
)
原先40秒的查询变成了3秒,效果显著;
2、PREWHERE
如果是MergeTree引擎,用PREWHERE代替WHERE来查询,PREWHERE首先会读取指定的列数据,来判断数据过滤,等待数据过滤之后再读取SELECT的列字段来补全其余属性。
3、groupArrayDistinct
优化前:
SELECT bitmapBuild(groupArray(offset)) AS bitmap FROM ...
优化后:
SELECT bitmapBuild(groupArrayDistinct(offset)) 性能提高非常显著
如果重复性数据越多效果应该会越好