不在子查询中速度慢且内存不足(clickhouse)

7xzttuei  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(461)

我有一张table,上面放着不同人群的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)。但是-速度很慢,内存不足。
我应该换一种方式吗?

oewdyzsn

oewdyzsn1#

我怀疑它内存不足的原因是 select variant from DNA where person in ('p2', 'p3') 子查询将导致 v2, v3, v2, v3 . 这一点,特别是在规模化的时候,由于重复性,似乎非常低效。可能,添加 distinct 查询可能会有所帮助,但一般来说,如果你有很多人,这似乎是一种效率低下的方法来实现你的结果(你必须手动输入很多人) where person in (.........) .
另一种方法是进行自连接,基本上将结果限制在唯一匹配的是自身的结果。比如:

SELECT person, COUNT(*)
FROM (
    SELECT * FROM table
    ALL LEFT JOIN table
    USING variant
)
GROUP BY person
HAVING COUNT(*) == 1;

相关问题