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

Posted

技术标签:

【中文标题】NOT IN 子查询速度慢并且内存不足(Clickhouse)【英文标题】:NOT IN Subquery slow and runs out of memory (Clickhouse) 【发布时间】:2018-10-22 09:03:19 【问题描述】:

我有一张桌子,里面有不同人的 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】:

我怀疑它内存不足的原因是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;

【讨论】:

以上是关于NOT IN 子查询速度慢并且内存不足(Clickhouse)的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别