使用 NOT EXISTS 重写查询的指南
Posted
技术标签:
【中文标题】使用 NOT EXISTS 重写查询的指南【英文标题】:Guidance in re-writing query using NOT EXISTS 【发布时间】:2019-04-11 11:02:59 【问题描述】:我们有一个针对不同来源的查询,每天运行很多次。 每次运行 40+ 分钟,我们正在尝试看看是否可以减少查询执行时间
查询所做的只是尝试向现有表添加新行(通过比较键)
SELECT A.*
FROM
(
SELECT *
FROM A
)
A
LEFT OUTER JOIN
(
SELECT f1, f11
FROM B
WHERE f13 IN ( SELECT f13 FROM C)
)
B
ON A.f1 = B.f1
AND nvl(A.f11,'NULL') = nvl(B.f11,'NULL')
WHERE isnull(B.f1)
AND isnotnull(A.f1)
我想做什么
SELECT A.* .
FROM (
SELECT *
FROM A
)
A
WHERE NOT EXISTS
(
SELECT 1
FROM B WHERE f13 IN ( SELECT f13 FROM C)
and A.f1 = B.f1 and A.f11 = B.f11
)
这项工作不仅会产生类似的结果,而且有助于减少执行时间。 由于此查询每天运行 8 次,因此查询的小幅改进将大有帮助。
任何建议都会有所帮助。
【问题讨论】:
Afaikhive
支持 MERGE
检查解释计划,在 Hive 1.2 NOT EXISTS 中生成与左连接 + isnull 过滤器相同的计划。
【参考方案1】:
在 Hive 中 NOT EXISTS
将生成与 left join + isnull filter
相同的计划。
您可以使用 UNION + row_number()
进行增量更新,例如此答案 https://***.com/a/44755825/2700344,无需加入,它可能会运行得更快
【讨论】:
以上是关于使用 NOT EXISTS 重写查询的指南的主要内容,如果未能解决你的问题,请参考以下文章