使用NOT EXISTS

时间:2019-04-11 11:02:59

标签: sql hadoop hive query-optimization hiveql

我们有一个查询,每天都会多次针对不同的来源运行。 每次运行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次,因此查询的一个小改进将大有帮助。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:1)

在Hive中,NOT EXISTS将生成与left join + isnull filter相同的计划。

您可以使用UNION + row_number()进行增量更新,例如此答案https://stackoverflow.com/a/44755825/2700344,而无需加入,它可能会更快运行