有个需求要优化查询
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
还有其他好办法吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.