Sql 有什么方法可以在Oracle 12C中增强下面的查询吗

Sql 有什么方法可以在Oracle 12C中增强下面的查询吗,sql,oracle12c,Sql,Oracle12c,无论如何,我们都可以在Oracle 12c中优化下面的查询,以获得更快的结果 TAB_C-是主表-2947109424计数,我们在TAB_Cact_id上有索引。但生产运行仍需3小时 SELECT ta.email_addr_id , ta.email_addr , SUBSTR(ta.email_addr, INSTR(ta.email_addr, '@') + 1,

无论如何,我们都可以在Oracle 12c中优化下面的查询,以获得更快的结果

TAB_C-是主表-2947109424计数,我们在TAB_Cact_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 ;

如果您有任何见解,我们将不胜感激。

-2947109424-为什么您的计数值为负值?发布您的查询执行计划。这不是负值TAB_C-计数值-2947109424没有查询计划,我们就走不了多远。话虽如此,该指数很可能没有多大用处。在Tab_C和act on act_id之间有一个内部连接,它将30亿行Tab_C与?一排排的表演。索引唯一有帮助的时候是act只有很少的行。在某些情况下,许多索引访问将比完整表扫描和哈希连接更昂贵。发布计划。我们是否可以在不使用DISTINCT函数的情况下以任何替代方式重新编写“DISTINCT”列,因为DISTINCT使查询速度非常慢。