Как ускорить запрос - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать таблицу с ниже 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 дня.Как я могу улучшить запрос, чтобы я мог выполнить запрос за меньшее время.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я думаю, вы неправильно понимаете, что делает группа по выражению.

Из ваших комментариев я предполагаю, что вы пытаетесь выполнить это на большом количестве данных, и это занимает много времени.Группировка по этому не поможет, выражения по группам используются для агрегирования данных по определенным полям, например, если я хочу узнать, сколько времени каждый пользователь провел, войдя в службу, с которой я мог бы использовать группу по имени пользователя.

Чтобы ускорить ваш запрос, я бы порекомендовал стандартный материал, убедитесь, что ваши таблицы правильно проиндексированы и убедитесь, что все эти объединения необходимы.

0 голосов
/ 26 ноября 2018

group by работает с функциями группировки, такими как sum, max, min и count.Когда вы используете некоторые из этих функций, вы обычно хотите суммировать группировку по некоторому атрибуту, например sum(sales) group by vendor.

Когда вы используете это ключевое слово в запросе без группировки функций, оно работает как distinct, но вы должны включить все свои поля в группу с помощью.

Ошибка, которую выполучать это просто, вы не включаете все свои поля в свой group by.

...