使用 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 次,因此查询的小幅改进将大有帮助。

任何建议都会有所帮助。

【问题讨论】:

Afaik hive 支持 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 重写查询的指南的主要内容,如果未能解决你的问题,请参考以下文章