NOT IN子查询速度慢,并且内存不足(Clickhouse)

时间:2018-10-22 09:03:20

标签: clickhouse

我有一张桌子,上面放着不同人的DNA变异体。我想展示一个人特有的变体:

表DNA(引擎按变体排序):

   person | variant
   p1     | v1 
   p1     | v2 
   p1     | v3 
   p2     | v2 
   p2     | v3 
   p3     | v2 
   p3     | v3
   p4     | v2 
   p4     | v3

一个简单的查询:

   select variant from DNA where person = 'p1' and variant 
     not in (select variant from DNA where person in ('p2', 'p3'))

将返回p1与p2和p3唯一的所有变体(此查询不考虑p4)。但是,它很慢,并且内存不足。

我应该以不同的方式这样做吗?

1 个答案:

答案 0 :(得分:2)

我怀疑内存不足的原因是select variant from DNA where person in ('p2', 'p3')子查询将导致v2, v3, v2, v3。由于重复,尤其是按比例放大时,这似乎效率极低。可能在查询中添加distinct可能会有所帮助,但是通常来说,如果您有很多人,这似乎是一种效率低下的方法(您必须手动在{{1 }}。

另一种替代方法是进行自我联接,并将结果基本上限制为唯一匹配的结果。像这样:

where person in (.........)