如何优化大型数据集的查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优化大型数据集的查询?相关的知识,希望对你有一定的参考价值。

我的原始查询 -

CREATE TABLE admin.FctPrfitAmt_rpt AS 
SELECT rcn.* FROM 
(SELECT t1.* FROM (SELECT * FROM admin.FctPrfitAmt t2 WHERE t2.scenario_id NOT IN(SELECT DISTINCT t3.scenario_id FROM admin.FctPrfitAmt_incr t3)
UNION ALL
SELECT * FROM admin.FctPrfitAmt_incr) t1) rcn;

问题是目前这个查询需要花费很多时间,因为涉及的记录数量很多。

有没有办法调整此查询?

我试过这种方法,但它不起作用 -

CREATE TABLE admin.FctPrfitAmt_rpt AS
SELECT * FROM admin.FctPrfitAmt t2 
WHERE t2.scenario_id NOT exists (SELECT 1 from  admin.FctPrfitAmt_incr t3 where t2.scenario_id = t3.scenario_id)
UNION ALL
SELECT * FROM admin.FctPrfitAmt_incr 

错误 - 我的Hive版本不支持“不存在”,所以对于我的方法,我得到以下错误:

编译语句时出错:FAILED:ParseException行3:25无法识别'NOT''exists'附近的输入''('在表达式规范中

答案
  1. 你的语法错了。 NOT EXISTS不应该在t2.scenario_id之前
  2. 我们可以看到,scenario_id在两个表上都有偏差,这会在连接上创建一个巨大的产品。

select  * 
from    admin.FctPrfitAmt   pa
where   not exists 
        (
            select  null

            from   (select  distinct 
                            pfa.scenario_id 

                    from    admin.FctPrfitAmt_incr  pfa
                    ) pfa

            where   pfa.scenario_id = 
                    pa.scenario_id
        )

union all

select  * 
from    admin.FctPrfitAmt_incr 
另一答案

你最好离开加入'select in'部分中的2个表并过滤掉连接键上非空的行。

CREATE TABLE admin.FctPrfitAmt_rpt AS 
    SELECT rcn.* FROM 
    (
        SELECT t1.* 
        FROM admin.FctPrfitAmt t1 
        LEFT JOIN admin.FctPrfitAmt_incr t2
        ON t1.scenario_id = t2.scenario_id
        WHERE t2.scenario_id IS NULL
        UNION ALL
        SELECT * FROM admin.FctPrfitAmt_incr
    ) rcn
;
另一答案
select  *

from   (select  *
               ,max(tab) over (partition by scenario_id) as max_tab

        from    (           select *,1 as tab from master.FctPrfitAmt
                union all   select *,2 as tab from master.FctPrfitAmt_incr
                ) t
        ) t

where   tab     = 2
     or max_tab = 1
;

如果您的所有数据都包含基本类型(没有数组,地图等), 您可以使用以下查询:

select  inline(array(original_rowset))

from   (select  original_rowset
               ,tab
               ,max(tab) over (partition by scenario_id) as max_tab

        from    (           select struct(*) as original_rowset,scenario_id,1 as tab from FctPrfitAmt
                union all   select struct(*) as original_rowset,scenario_id,2 as tab from FctPrfitAmt_incr
                ) t
        ) t

where   tab     = 2
     or max_tab = 1

以上是关于如何优化大型数据集的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何改进热图的大型数据集的 KQL 查询

如何避免大型数据集的Pandas DataFrame中的for循环

大型数据集的自动完成优化

如何优化 Python 中大型(75,000 项)布尔值集的操作?

ASP.NET WebAPI和带有大型数据集的jQuery(json)

对于大型数据集的查询,日期类型是不是比日期时间更高效?