sql - 执行级联“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
,但不知道创建两个表是否会产生更多开销。
解决方案
在第二种情况下,您似乎错过了 WHERE 子句。如果没有WHERE
( key in LIST
, key NOT IN list )
,第二个查询将产生 x2 行。
即使使用 WHERE,在第二个查询中也会对表进行两次扫描,尽管它会并行完成,但会产生 2 倍的负载。
只有事实,而不是意见:第一次要短得多,第一次查询保证只扫描一次表。
即使 case1 和 case2 一起返回的行数少于整个表包含的行数,替换UNION ALL
为OR
条件 inWHERE
是更高效的解决方案。
推荐阅读
- c# - Internet Explorer 中的 WPF XBAP DPI 缩放
- javascript - Gulp Concat + Uglify 订单 JS 错误
- java - 在 Spring Boot 控制器中使用 GraphQL API
- php - 在 MySQL 数据库中创建用户
- jenkins - 如何在 Jenkins 共享库函数中存储/取消存储文件
- delphi - Delphi 只复制具有特定扩展名的文件
- cordova - 单击cordova android中的下拉菜单
- python - Python 替换 || 具有 CONCAT 功能的运算符
- unix - 使用 sed 替换通配符
- angular - 如何正确过滤角度数组