clickhouse从单机切换到分布式,查询的sql也需要跟随变化,最近线上遇到不少问题,这里给大家总结一下,给遇到类似问题同学提供一些帮助。
我们用分布式表查询sql如下:
select a.* from app1.test_event1_distributed a where device_id in (select device_id from app1.test11111_distributed);
出现如下的报错:
Code: 288. DB::Exception: Received from 192.168.0.94:9000. DB::Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). You may rewrite query to use local tables in subqueries, or use GLOBAL keyword, or set distributed_product_mode to suitable value
根据提示以及查询clickhouse的官方文档,解决方案如下,sql需要调整为:
select a.* from app1.test_event1_distributed a where device_id global in (select device_id from app1.test11111_distributed);
这个是为什么呢?是因为当查询分布式表时,将会把如下查询发送到所有远程服务器,我们需要使用global,才能运行每个服务器的子查询。
总结: 1:查询clickhouse都得使用”库名.表名”的方式去查询,避免出现not find的报错。 2:使用分布式查询使用global关键词进行查询,比如global in/global join等