【问题标题】:Oracle query performance issue?Oracle 查询性能问题?
【发布时间】:2015-03-06 09:15:11
【问题描述】:

如何调整以下查询?

 SELECT  /* + ALL_ROWS */
distinct 
--(select name from  team where team_id in (select team_id from alignment where alignment_id=a.alignment_id))as team_name,
(select name from team where team_id=a.team_id) as team_name,
e.employee_id, --REP EMPLOYEE_ID
c.external_id_2,
c.name || ','|| c.first_name as customer_name,
c.customer_sub_type, -- spcialty
event.ENTRY_DATE ,
CASE 
  WHEN event.EVENT_TYPE='C' and event.APPOINTMENT_TYPE='GA' THEN 'Via Appointment'
  WHEN event.EVENT_TYPE='C' and event.APPOINTMENT_TYPE is null THEN 'Direct Call'
  ELSE '-'
END EVENT_TYPE,
event.Event_id,
rating.rating_category, -- RATING CATEGORY
rating.call_frequency,
adr.line_1_address address1, -- address1
adr.line_2_address address2,  --address2
adr.city,   --city
adr.state,  --state
adr.geography_code_1, -- brick name
event.start_date_time, --Start date
event.status_change_date,
nt.note_text call_objective,--next call OBJECTIVE
ed.text_1 as Call_Objective_results,
(select display_name from product where product_id in(select max(product_id) from event_detail where sequence=1 and event_id=event.event_id)) as product_1,
(select display_name from product where product_id in(select max(product_id) from event_detail where sequence=2 and event_id=event.event_id)) as product_2,
(select display_name from product where product_id in(select max(product_id) from event_detail where sequence=3 and event_id=event.event_id)) as product_3,
(select display_name from product where product_id in (
(select max(product_id) from event_item where product_id in (ei.product_id) ))) || ' , '|| ei.quantity as promotinal_items_type_quantity,
(select display_name from product where product_id in (
(select max(product_id) from sample_transaction where product_id not in (ei.product_id) and event_id=event.event_id)))|| ' , '||
(select physical_quantity from sample_transaction where product_id in (
(select max(product_id)  from product where product_id not in (ei.product_id) and event_id=event.event_id)) ) as pob_product_quantity,
event.accompanied_by,
--(select ACCOMPANIED_BY from event ev where tenant_id=500020 and employee_id in (::employee_id) and ev.event_id=event.event_id) Accompanied_BY,
event.status,
event.end_date_time FROM employee e
inner join alignment a on e.employee_id=a.employee_id
inner join
(
 select event_id,alignment_id,employee_id,affiliation_id,customer_id, interaction_channel, start_date_time,end_date_time,STATUS_CHANGE_DATE, 
ENTRY_DATE ,EVENT_TYPE,APPOINTMENT_TYPE,
status,accompanied_by from event ev where
 ev.event_type in (::event_type) and tenant_id=500020 and  start_date_time>=:start_date  AND end_date_time<=:end_date  and
 ev.employee_id in 
(
  select employee_id from alignment where  manager_alignment_id in
(
   select alignment_id from alignment where manager_alignment_id in
     (
    select alignment_id from alignment  where employee_id in
       (
        ::employee_id
        )
      )
) or  manager_alignment_id in(

 select alignment_id from alignment  where employee_id in
       (
       ::employee_id        
    )
 )
or  alignment_id in(

 select alignment_id from alignment  where employee_id in
       (
       ::employee_id        
    )
 )
) and ev.status in (::status) or (ev.tenant_id=500020  and 'VPOS'=(select distinct role from alignment where employee_id in (  ::employee_id ) AND role='VPOS' ) and  ev.event_type in (::event_type) and   start_date_time>=:start_date  AND end_date_time<=:end_date)
)event on a.employee_id=event.employee_id and event.interaction_channel ='INPR'
inner join affiliation aff on event.affiliation_id=aff.affiliation_id
left outer join event_dynamic ed on event.event_id=ed.event_id
left outer join  event_item ei on ei.event_id=event.event_id
inner join customer c on c.customer_id=event.customer_id and c.customer_type IN ('PRES','NPRS')
left outer join address adr on aff.address_id=adr.address_id
left outer join notes nt on event.event_id=nt.event_id and nt.customer_id=c.customer_id and note_type='CC'
left outer join
(
   select dnr.dn_rating_attribute_id,r.team_id,
         r.customer_id,
            (select note_text from notes where
             CUSTOMER_ID=r.customer_id
            and note_type='CC' and event_id IS null) nextcall_objective,
         r.user_account_id,
         r.value_min,
               case
     when r.value_min = '1' then 'A'
     when r.value_min=  '2' then 'B'
     when r.value_min = '3' then 'C'
    end  RATING_CATEGORY
          from dn_rating_attribute dnr
  inner join rating r on r.dn_rating_attribute_id=dnr.dn_rating_attribute_id 
  where  dnr.external_id_1='IND_CATEGORY'
) rating  on c.customer_id=rating.customer_id and rating.team_id in ( select team_id from alignment where employee_id=event.employee_id )
left outer join
(
   select dnr.dn_rating_attribute_id,r.team_id,
         r.customer_id,
         r.user_account_id,
         r.value_min,
               case
     when r.value_min = '1' then '1'
     when r.value_min=  '2' then '2'
     when r.value_min = '3' then '3'
    end  Call_frequency
        from dn_rating_attribute dnr
   inner join rating r on r.dn_rating_attribute_id=dnr.dn_rating_attribute_id

  where  dnr.external_id_1='IND_CALLFREQUENCY'
) rating  on c.customer_id=rating.customer_id and rating.team_id in ( select team_id from alignment where employee_id=event.employee_id )

获取记录需要很长时间。我不确定在哪里需要很长时间。我应该为此使用任何提示吗?

这是执行计划

0       SELECT STATEMENT        36114   11M 503880  12G 503424   
1   0     INDEX RANGE SCAN  PEUSPMMI.TEAM_PF1   1   19  1   7321    1    
2   0     TABLE ACCESS BY INDEX ROWID   PEUSPMMI.PRODUCT    1   25  2   15463   2    
3   2       INDEX UNIQUE SCAN   PEUSPMMI.PRODUCT_PK 1       1   8171    1    
4   3         SORT AGGREGATE        1   21               
5   4           TABLE ACCESS BY INDEX ROWID PEUSPMMI.EVENT_DETAIL   1   21  4   29817   4    
6   5             INDEX RANGE SCAN  PEUSPMMI.EVENT_DETAIL_PF2   2       3   21964   3    
7   0     TABLE ACCESS BY INDEX ROWID   PEUSPMMI.PRODUCT    1   25  2   15463   2    
8   7       INDEX UNIQUE SCAN   PEUSPMMI.PRODUCT_PK 1       1   8171    1    
9   8         SORT AGGREGATE        1   21               
10  9           TABLE ACCESS BY INDEX ROWID PEUSPMMI.EVENT_DETAIL   1   21  4   29817   4    
11  10            INDEX RANGE SCAN  PEUSPMMI.EVENT_DETAIL_PF2   2       3   21964   3    
12  0     TABLE ACCESS BY INDEX ROWID   PEUSPMMI.PRODUCT    1   25  2   15463   2    
13  12      INDEX UNIQUE SCAN   PEUSPMMI.PRODUCT_PK 1       1   8171    1    
14  13        SORT AGGREGATE        1   21               
15  14          TABLE ACCESS BY INDEX ROWID PEUSPMMI.EVENT_DETAIL   1   21  4   29817   4    
16  15            INDEX RANGE SCAN  PEUSPMMI.EVENT_DETAIL_PF2   2       3   21964   3    
17  0     TABLE ACCESS BY INDEX ROWID   PEUSPMMI.PRODUCT    1   25  2   15463   2    
18  17      INDEX UNIQUE SCAN   PEUSPMMI.PRODUCT_PK 1       1   8171    1    
19  18        SORT AGGREGATE        1   10               
20  19          FIRST ROW       68  680     1   21571   1    
21  20            INDEX RANGE SCAN (MIN/MAX)    PEUSPMMI.EVENT_ITEM_FK2 68  680     1   21571   1    
22  0     TABLE ACCESS BY INDEX ROWID   PEUSPMMI.PRODUCT    1   25  2   15463   2    
23  22      INDEX UNIQUE SCAN   PEUSPMMI.PRODUCT_PK 1       1   8171    1    
24  23        SORT AGGREGATE        1   19               
25  24          TABLE ACCESS BY INDEX ROWID PEUSPMMI.SAMPLE_TRANSACTION 1   19  2   15974   2    
26  25            INDEX RANGE SCAN  PEUSPMMI.SAMPLE_TRANSACTION_FK4 1       1   8371    1    
27  0     FILTER                             
28  27      TABLE ACCESS FULL   PEUSPMMI.SAMPLE_TRANSACTION 37771   848K    205     18M 204      
29  27      SORT AGGREGATE      1   9                
30  29        FILTER                             
31  30          FIRST ROW       1   9   2   14493   2    
32  31            INDEX FULL SCAN (MIN/MAX) PEUSPMMI.PRODUCT_PK 1   9   2   14493   2    
33  0     HASH UNIQUE       36114   11M 503880  12G 503424  11M
34  33      NESTED LOOPS OUTER      36114   11M 501364  12G 500912   
35  34        NESTED LOOPS OUTER        36114   10M 284619  11G 284228   
36  35          HASH JOIN OUTER     36114   10M 67875   9G  67544   8576K
37  36            VIEW      36114   8146K   53266   8G  52971    
38  37              FILTER                           
39  38                HASH JOIN RIGHT OUTER     36114   10M 53263   8G  52969    
40  39                  TABLE ACCESS FULL   PEUSPMMI.EVENT_ITEM 7860    168K    17  2692444     17   
41  39                  NESTED LOOPS        36114   10M 53246   8G  52952    
42  41                    HASH JOIN     36114   9980K   53243   8G  52952    
43  42                      TABLE ACCESS FULL   PEUSPMMI.ALIGNMENT  950     16K 10  816335  10   
44  42                      HASH JOIN OUTER     36114   9345K   53233   8G  52942   8504K
45  44                        HASH JOIN OUTER       35521   8082K   45773   7G  45525   5920K
46  45                          HASH JOIN       35445   5503K   41799   6G  41569   3992K
47  46                            HASH JOIN     35484   3569K   30983   4G  30814   3368K
48  47                              TABLE ACCESS FULL   PEUSPMMI.EVENT  35530   2949K   27495   4G  27343    
49  47                              INDEX FAST FULL SCAN    PEUSPMMI.AFFILIATION_PF12   1342K   23M 1412    195M    1405     
50  46                            TABLE ACCESS FULL PEUSPMMI.CUSTOMER   706K    37M 8346    1G  8292     
51  45                          TABLE ACCESS FULL   PEUSPMMI.ADDRESS    303K    21M 2449    431M    2434     
52  44                        TABLE ACCESS FULL PEUSPMMI.EVENT_DYNAMIC  1255K   38M 4426    906M    4394     
53  41                    INDEX UNIQUE SCAN PEUSPMMI.EMPLOYEE_PK    1   9   0   1900    0    
54  38                FILTER                             
55  54                  TABLE ACCESS BY INDEX ROWID PEUSPMMI.ALIGNMENT  1   23  2   15640   2    
56  55                    INDEX UNIQUE SCAN PEUSPMMI.ALIGNMENT_UK1  1       1   8171    1    
57  54                  NESTED LOOPS                             
58  57                    NESTED LOOPS      1   31  3   23674   3    
59  58                      INDEX RANGE SCAN    PEUSPMMI.ALIGNMENT_PF2  1   15  2   14463   2    
60  58                      INDEX UNIQUE SCAN   PEUSPMMI.ALIGNMENT_UK1  1       0   1900    0    
61  57                    TABLE ACCESS BY INDEX ROWID   PEUSPMMI.ALIGNMENT  1   16  1   9211    1    
62  54                  TABLE ACCESS BY INDEX ROWID PEUSPMMI.ALIGNMENT  1   16  2   15533   2    
63  62                    INDEX UNIQUE SCAN PEUSPMMI.ALIGNMENT_UK1  1       1   8171    1    
64  54                  TABLE ACCESS BY INDEX ROWID PEUSPMMI.ALIGNMENT  1   16  2   15533   2    
65  64                    INDEX UNIQUE SCAN PEUSPMMI.ALIGNMENT_UK1  1       1   8171    1    
66  38                TABLE ACCESS BY INDEX ROWID   PEUSPMMI.ALIGNMENT  1   12  2   15693   2    
67  66                  INDEX UNIQUE SCAN   PEUSPMMI.ALIGNMENT_UK1  1       1   8171    1    
68  36            TABLE ACCESS FULL PEUSPMMI.NOTES  1138K   89M 9125    700M    9100     
69  35          VIEW        1   6   6   47959   6    
70  69            NESTED LOOPS                           
71  70              NESTED LOOPS        1   75  6   47959   6    
72  71                MERGE JOIN CARTESIAN      1   52  3   25134   3    
73  72                  TABLE ACCESS BY INDEX ROWID PEUSPMMI.DN_RATING_ATTRIBUTE    1   34  2   15903   2    
74  73                    INDEX RANGE SCAN  PEUSPMMI.DN_RATING_ATTRIBUTE_PF2    1       1   8171    1    
75  72                  BUFFER SORT     1   18  1   9231    1    
76  75                    TABLE ACCESS BY INDEX ROWID   PEUSPMMI.ALIGNMENT  1   18  1   9231    1    
77  76                      INDEX UNIQUE SCAN   PEUSPMMI.ALIGNMENT_UK1  1       0   1900    0    
78  71                INDEX RANGE SCAN  PEUSPMMI.RATING_UK1 1       2   15313   2    
79  70              TABLE ACCESS BY INDEX ROWID PEUSPMMI.RATING 1   23  3   22824   3    
80  34        VIEW      1   6   6   47959   6    
81  80          NESTED LOOPS                             
82  81            NESTED LOOPS      1   75  6   47959   6    
83  82              MERGE JOIN CARTESIAN        1   52  3   25134   3    
84  83                TABLE ACCESS BY INDEX ROWID   PEUSPMMI.DN_RATING_ATTRIBUTE    1   34  2   15903   2    
85  84                  INDEX RANGE SCAN    PEUSPMMI.DN_RATING_ATTRIBUTE_PF2    1       1   8171    1    
86  83                BUFFER SORT       1   18  1   9231    1    
87  86                  TABLE ACCESS BY INDEX ROWID PEUSPMMI.ALIGNMENT  1   18  1   9231    1    
88  87                    INDEX UNIQUE SCAN PEUSPMMI.ALIGNMENT_UK1  1       0   1900    0    
89  82              INDEX RANGE SCAN    PEUSPMMI.RATING_UK1 1       2   15313   2    
90  81            TABLE ACCESS BY INDEX ROWID   PEUSPMMI.RATING 1   23  3   22824   3    

请做必要的事情。

我正在使用 Oracle 11g。

【问题讨论】:

  • 任何以select distinct 开头的大型查询几乎肯定会成为性能问题。所以,在使用提示之前,为什么不制定解释计划并理解它显示的内容。
  • 如果删除:A: DISTINCT 和 B: select 子句 does it run much faster? 中的每个相关子查询
  • 如果您需要对查询进行性能调优,如果您包含执行计划,将会有很大帮助。
  • 嗨,谢谢您的回复。 A: 和 B: 从前端传递参数。这些值是必需的。
  • 删除“选择不同的”(第 1 步)

标签: sql oracle


【解决方案1】:

“我不确定它在哪里需要很长时间。”

无需猜测。使用Real-Time SQL Monitoring 找出确切哪些操作运行时间最长。 (如果您继续使用该软件包,可能需要额外的许可,但您至少应该对其进行评估。)

select dbms_sqltune.report_sql_monitor(sql_id =&gt; 'your_id', type =&gt; 'text') from dual;

还有其他一些方法可以做到这一点,例如跟踪、GATHER_PLAN_STATISTICS 提示等。但是 SQL 监控是最容易使用的并且提供的信息最多。单独的解释计划通常不足以调整具有复杂执行计划的大型 SQL 语句。

用结果编辑您的问题,根本原因可能很明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2013-01-20
    相关资源
    最近更新 更多