代码之家  ›  专栏  ›  技术社区  ›  vy32

Spark:为什么带有“不在”的子选择要比“在”慢得多?

  •  1
  • vy32  · 技术社区  · 7 年前

    我在ApacheSpark2.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 回复  |  直到 7 年前
        1
  •  1
  •   Oleksii G.    7 年前

    我不知道Apache Spark,但在我看来,数据库可以通过IDNUM快速访问A和B中的行/项,因此,如果通过条件“IDNUM in(SELECT IDNUM FROM B)”的元素数较低,则可以非常快速地处理检查相等性的subselect或join。获取整个表的计数是一个常见的情况,因此它将被优化为快速。

    ‘IDNUM NOT IN(SELECT IDNUM FROM B)’天真地需要扫描A中所有行的IDNUM列,以检查它们是否不在B的集合中。由于您只是在执行计数,因此实际上并不需要这些行的IDNUM值,但我猜查询优化器不够聪明,无法将查询转换为两个计数之间的差异。

    推荐文章