我们有一个查询,每天都会多次针对不同的来源运行。 每次运行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次,因此查询的一个小改进将大有帮助。
任何建议都会有所帮助。
答案 0 :(得分:1)
在Hive中,NOT EXISTS
将生成与left join + isnull filter
相同的计划。
您可以使用UNION + row_number()
进行增量更新,例如此答案https://stackoverflow.com/a/44755825/2700344,而无需加入,它可能会更快运行