Spark:为什么带有“ NOT IN”的子查询比“ IN”慢得多?

时间:2019-01-25 23:46:19

标签: performance apache-spark

我在Apache Spark 2.x中有两个表。每个表都有一个公共行“ IDNUM”。称它们为表A和表B。

这在Apache SparkSQL中很快:

SELECT COUNT(*) FROM A where IDNUM IN (SELECT IDNUM FROM B);

这非常慢:

SELECT COUNT(*) FROM A where IDNUM NOT IN (SELECT IDNUM FROM B);

它是如此之慢,以至于只是为了完成而更快:

total = SELECT COUNT(*) FROM A;
quan  = SELECT COUNT(*) FROM A where IDNUM IN (SELECT IDNUM FROM B);
print(total-quan)

但是我不知道为什么NOT IN应该这么慢。

1 个答案:

答案 0 :(得分:1)

我不了解Apache Spark,但据我看来,数据库可以通过IDNUM快速访问A和B中的行/项,因此如果数字相等,可以非常快速地处理检查相等性的子选择或联接满足条件“ IDNUM IN(SELECT IDNUM FROM B)”的元素的数量低。获取整个表的计数是一种常见的情况,因此将对其进行优化以使其更快。

'IDNUM NOT IN(从B选择IDNUM)'天真地需要扫描IDNUM列以查找A中的所有行,以确保它们不在B的集合中。因为您只在进行计数,所以不需要确实需要这些行中的IDNUM值,但是我想查询优化器不够聪明,无法将查询转换为两个计数之间的差。