首页 > 解决方案 > 执行级联“if”或合并两个子查询过滤查询是否更快?

问题描述

我正在编写一个 Spark SQL 查询,并问自己对于 SQL 优化引擎是否更容易执行

SELECT key
  , IF(key IN list, value1, value1 + 1]) AS value1
  , IF(key IN list, value2, value2 + 1) AS value2
  , IF(key IN list, value3, value3 + 1) AS value3
FROM ATable

或者

WITH case1 AS (
SELECT key
  , value1 AS value1
  , value2 AS value2
  , value3 AS value3
FROM ATable
)
  , case2 AS (
SELECT key
  , value1 + 1 AS value1
  , value2 + 1 AS value2
  , value3 + 1 AS value3
FROM ATable
)
SELECT * FROM case1
UNION ALL
SELECT * FROM case2

在我看来,如果 s 的列表很长,则第二种方式更具可读性IF,但不知道创建两个表是否会产生更多开销。

标签: sqlapache-spark

解决方案


在第二种情况下,您似乎错过了 WHERE 子句。如果没有WHERE( key in LIST, key NOT IN list ),第二个查询将产生 x2 行。

即使使用 WHERE,在第二个查询中也会对表进行两次扫描,尽管它会并行完成,但会产生 2 倍的负载。

只有事实,而不是意见:第一次要短得多,第一次查询保证只扫描一次表。

即使 case1 和 case2 一起返回的行数少于整个表包含的行数,替换UNION ALLOR条件 inWHERE是更高效的解决方案。


推荐阅读