使用“不存在”重新编写查询时的sql指导

jw5wzhpr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(275)

我们有一个针对不同来源的查询,每天运行很多次。每次运行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次。
任何建议都会有帮助。

9rbhqvlz

9rbhqvlz1#

在Hive里 NOT EXISTS 将生成与 left join + isnull filter .
你可以使用union+ row_number() 对于这个答案中的增量更新https://stackoverflow.com/a/44755825/2700344,如果没有连接,它可能工作得更快

相关问题