有没有一种方法可以增强Oracle 12C中的以下查询

时间:2020-11-12 04:21:17

标签: sql oracle12c

无论如何,我们可以在Oracle 12c中优化以下查询以提供更快的结果。

TAB_C-是主表-2947109424的计数,我们在TAB_C(act_id)上具有索引。但是仍需要3个小时才能投入生产。

SELECT ta.email_addr_id 
                       , ta.email_addr 
                        , SUBSTR(ta.email_addr, INSTR(ta.email_addr, '@') + 1,  
                           INSTR(ta.email_addr, '.', -1) - INSTR(ta.email_addr, '@') 
                           - 1) AS email_domain
                         , mtr.max_email_response_date  
                         , ta.add_date  
                         , net.num_12mons 
                         , net.num_3mons 
                          , net.num_6mons 
                          , net.num_9mons 
                         , ta.hard_bounce_ind 
                         , ta.email_addr_text_att_02 AS preference_birth_date 
                          ,ta.source AS source 
                     FROM Tab_A ta 
                     LEFT JOIN ( 
                         SELECT tr.email_addr_id 
                             , tcX(tr.email_response_date) AS max_email_response_date  
                         FROM Tab_B tr 
                         where tr.email_response_date = 'NEW' 
                             AND tr.update_source <> 'EXP_EVENT' 
                         GROUP BY tr.email_addr_id 
                     ) mtr  
                     ON ta.email_addr_id = mtr.email_addr_id 
                     LEFT JOIN ( 
                         SELECT tc.email_addr_id 
                             , COUNT(DISTINCT tc.m_act_id) AS num_12mons 
                             , COUNT(DISTINCT CASE WHEN ROUND(tc.outbound_date, 'DD')  
                                 > (ROUND(sysdate, 'DD') - 90) 
                                 THEN tc.m_act_id ELSE NULL END) AS num_3mons 
                              , COUNT(DISTINCT CASE WHEN ROUND(tc.outbound_date, 'DD')  
                                  > (ROUND(sysdate, 'DD') - 180) 
                                  THEN tc.m_act_id ELSE NULL END) AS num_6mons 
                              , COUNT(DISTINCT CASE WHEN ROUND(tc.outbound_date, 'DD')  
                                  > (ROUND(sysdate, 'DD') - 270) 
                                  THEN tc.m_act_id ELSE NULL END) AS num_9mons 
                         FROM Tab_C tc     
                         INNtr JOIN act a 
                         ON tc.act_id = a.act_id 
                         where a.channel_code IN ('FM','RM') 
                             AND ROUND(tc.outbound_date, 'DD') > (ROUND(sysdate, 'DD') - 365) 
                         GROUP BY tc.email_addr_id 
                     ) net 
                     ON ta.email_addr_id = net.email_addr_id 
                     where ta.email_addr_id <> 0 ;

任何见识都会得到高度赞赏。

0 个答案:

没有答案