sql - 使用 NOT EXISTS 重写查询的指导

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

任何建议都会有所帮助。

最佳答案

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

您可以使用 UNION + row_number() 进行增量更新,就像这个答案 https://stackoverflow.com/a/44755825/2700344 中一样, 没有加入, 它可能工作得更快

关于sql - 使用 NOT EXISTS 重写查询的指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55630972/

相关文章:

sql - 主表节点丢失,SQL Server 2012 SP1

java - 如何将任务重新分配到Hadoop?

hive - 如何从 hive 2.2.0 中的 ARRAY<string> 获取第一个非空元素

hadoop - 将列添加到Hive外部表错误

hadoop - 在Hive中产生较大结果的最佳方法是什么

mysql - 如何在 MySQL 中记录最后日期?

mysql - 基表或 View 已存在! (拉拉维尔航海者)

c# - 如何通过 C# 检索所有可能的服务器名称

json - Map Reduce 以在 hadoop 2.2 中解析 JSON 数据

hadoop - 如何将 hadoop 节点设置为任务跟踪器而不是数据节点