如何加快查询速度

Posted

技术标签:

【中文标题】如何加快查询速度【英文标题】:How to Speed up the query 【发布时间】:2018-11-26 10:53:38 【问题描述】:

我正在尝试使用下面的 sql 创建一个表,它已经运行了好几天。

下面是sql。

create table I83094_Emnmt1 AS
    Select 
     'I83094'                                              AS Audit_Id
     ,rap01.plcy                                           AS plcy
     ,raa02.enddt_t                                        As enddt
     ,RPAD(NVU_GET_TERM_ID(RAP01.PLCY, Raa02.ENDDT_T),1)   AS Term_Id
     ,nvu_get_nxt_proc_enddt(RAP01.PLCY, Raa02.ENDDT_T)    As next_enddt
     ,exception_date                                       AS exception_date
     ,RAP07.MVRDT_t
     ,RAP07.MVRDT_s
     ,rap07a.prefdt_t
     ,RAP07.MRTLST
     ,RAP07.BRTHDT_T                                       AS BirthDate
     ,floor((tt.ja2_effdt_t - RAP07.BRTHDT_T)/365 )        AS Operator_Age
     ,rap07a.perseq
     ,tt.ja2_effdt_t                                       AS TERM_DATE
     ,rap01.j01_PT_LINE_cat_Cd                             AS j01_PT_LINE_cat_Cd
     ,rap01.j01_pt_cdb_part_id                             AS j01_pt_cdb_part_id
     ,Rap01.J01_Pt_State_Cd                                As J01_Pt_State_Cd
     ---
from RAP01
----
Join RAA02
  ON raa02.j46_pt_line_cat_cd  = rap01.j01_pt_line_cat_cd
AND raa02.j46_pt_cdb_part_id   = rap01.j01_pt_cdb_part_id
AND raa02.j46_pt_state_cd      = rap01.j01_pt_state_cd
AND raa02.plcy                 = rap01.plcy
AND raa02.sprodt_t  between '14-OCT-2013' AND '14-OCT-2018'
AND raa02.ahevnt               = '0993'
---
JOIN ewt_prama_term tt
  ON tt.ja2_pt_line_cat_cd     = rap01.j01_pt_line_cat_cd
AND tt.ja2_pt_cdb_part_id      = rap01.j01_pt_cdb_part_id
AND tt.ja2_pt_state_cd         = rap01.j01_pt_state_cd
AND tt.ja2_plcy                = rap01.plcy
and raa02.enddt_t              between tt.ja2_effdt_t and tt.ja2_expdt_t - 1
-----
JOIN rap07a
  ON rap07a.j36_pt_line_cat_cd = rap01.j01_pt_line_cat_cd
AND rap07a.j36_pt_cdb_part_id  = rap01.j01_pt_cdb_part_id 
AND rap07a.j36_pt_state_cd     = rap01.j01_pt_state_cd
AND rap07a.plcy                = rap01.plcy
--and RAP07a.perseq              = rap18.perseq
AND raa02.enddt_t  BETWEEN rap07a.prefdt_t AND (rap07a.dropdt_t  - 1)
----
JOIN RAP07
  ON  RAP07.J37_PT_LINE_CAT_CD =  rap01.j01_pt_line_cat_cd   
AND  RAP07.J37_PT_CDB_PART_ID  =  rap01.j01_pt_cdb_part_id  
AND  RAP07.J37_PT_STATE_CD     =  rap01.j01_pt_state_cd     
AND  rap07.plcy                =  RAP01.PLCY
AND  RAP07.perseq              =  rap07a.perseq
AND RAP07.MRTLST in ('MA','IC','DC','WC','EC','DP')
--AND RAP07.DRVDES_01 IN ('R','P')  
--AND RAP07.MVRDT_T < (select exception_date from I83094_exception)
AND floor((tt.ja2_effdt_t - RAP07.BRTHDT_T)/365) < 50
AND  raa02.enddt_t BETWEEN RAP07.enddt_t AND (RAP07.dropdt_t  - 1)
---
join I83094_exception exp
  ON exp.line_cd               = rap01.line3
AND exp.state_cd               = rap01.state
AND exp.company_cd             = rap01.co3
AND exp.marital_status_cd      = RAP07.MRTLST
---
WHERE Rap01.J01_Pt_Line_Cat_Cd = 'A'
AND Rap01.Line3               IN ('010','019')
AND RAP07.MVRDT_T < exp.exception_date;

字段 'J01_Pt_State_Cd' 代表不同的状态,这个表包含数十亿的数据,并且会花费很多时间来执行。 我试图创建表,但必须等待 2 或 3 天。 如何改进查询,以便在更短的时间内执行查询。

【问题讨论】:

***.com/help/mcve 如果不聚合,为什么要使用 group by? @HoneyBadger ,我这里有 45 个状态,每个状态都包含大量数据,我担心的是如何将特定状态的这些行排列到一个组中,或者在这里使用 group by 没有意义? 我不确定您在这里寻找什么样的答案。在不知道表定义以及约束、索引和数据量和分布的情况下,没有人能真正告诉你它的对错。如果您正在寻求通用查询性能故障排除提示,那么这是另一个问题。在 10g 中,通常值得将动态采样级别提高到 8 或 9,以查看优化器在提供更多信息时会得出什么结果,并使用从中获得的见解来重写或提示查询或修复统计问题。在 12c 统计反馈中增加了另一个维度。 删除组有帮助吗?您也可以尝试切换到 CTE 或一一进行连接(在每个步骤中创建临时表)。也许也尝试做 MERGE 而不是加入。 【参考方案1】:

group by 与分组函数一起使用,例如 summaxmincount。当您使用其中一些函数时,您通常希望按某个属性对分组求和,例如sum(sales) group by vendor

当您在没有分组函数的查询中使用此关键字时,它的工作方式类似于 distinct,但您必须将所有字段包含在分组依据中。

您得到的错误就是,您没有在group by 中包含所有字段。

【讨论】:

【参考方案2】:

我认为您误解了按表达式分组的作用。

从您的 cmets 来看,我假设您正试图在大量数据上运行它,并且需要很长时间。 group by 对此无济于事,group by 表达式用于聚合某些字段上的数据,例如,如果我想了解每个用户登录服务的时间,我可以在用户名上使用 group by。

为了加快您的查询速度,我建议您使用标准的东西,确保您的表是 indexed properly 并确保所有这些连接都是必要的。

【讨论】:

正是这个问题,我想加快查询的执行速度。我也编辑了这个问题。 @Kaushal 如果您希望加快查询速度,那么这是this的副本

以上是关于如何加快查询速度的主要内容,如果未能解决你的问题,请参考以下文章

如何加快查询速度?

如何加快查询速度

如何在 Azure 表存储中使用 partitionkey 加快查询速度

如何使用多个 INNER JOIN 加快查询速度

带有排序的 MongoDB 范围查询 - 如何加快速度?

如何通过 IP 地址查询加快国家检测速度?