有个需求要优化查询
A 表有 18 亿数据,大概每天千万条,每个数据都有 app_id , shop_id 和 date ,然后是 order by date
B 表则是每个 app_id 一天一条数据,每条数据有一个存了符合某种情况的 shop_id 的 bitmap
现在要查满足某种情况的 shop 在 A 表里的数据,limit 100000
试了下
select * from A inner join B on A.app_id = B.app_id and A.date = B.date
where app_id = 1
and date between '2021-03-10' and '2021-03-16'
and bitmapContains(B.bitmap, A.shop_id)
limit 10;
这样完全都跑不动,报内存不够了,昨天的数据也就千万级左右,用子查询先把 B 表用 date 过滤一下再 join 也没用
我猜想 clickhouse 是先全 join 起来再用 where 过滤
查了下文档发现能构造 map,感觉可以用 B 表构造一个 date-bitmap 的 map 然后直接 where 就行
但是直接复制文档上的构造 map 的 sql 都报语法错误,好像是我这个版本根本不支持 map
还有其他好办法吗