使用不存在重写查询的指南



我们有一个针对不同源运行的查询,每天多次。每次它运行 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 次。

任何建议都会有所帮助。

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

您可以使用 UNION + row_number() 进行增量更新,如本答案 https://stackoverflow.com/a/44755825/2700344 所示,无需加入,它可能会更快地工作

最新更新