【问题标题】:Adding Indexes to improve performance添加索引以提高性能
【发布时间】:2015-11-17 21:52:37
【问题描述】:

我有一个查询需要大约 4 小时才能执行。我需要添加索引来提高性能。请建议我可以在哪里为下面的解释计划添加索引:另外请建议如何在查询中添加索引。

查询:

SELECT 
 TO_CHAR(GREATEST(cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900')),'DD-MON-RRRR HH24:MI:SS')  START_DATE, 
 TO_CHAR(LEAST(cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999')) ,'DD-MON-RRRR HH24:MI:SS') END_DATE, 
 DECODE(cns.STATUS,'CI','I','CU','I','QI','I','QU','I') STATUS,  
 CNS_CST_SER_BIT, 
 CNS_IDENT,
 cns_nst_code  CNS_NST_CODE, 

 (SELECT DISTINCT NST_IDENT FROM number_string_type NST 
 WHERE nst_code = cns.cns_nst_code 
 AND nvl(NST.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')  
 AND GREATEST(NST.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900')) 
 <  LEAST(NST.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999')) )

 NST_IDENT, 
 CNS_DESC,  
 CNS_CNT_IDENT,
 CNS_SYS_BIT,  
 CNS_CST_CODE, 

 (SELECT DISTINCT  cst_ident FROM charge_structure CST
 WHERE cst_code = cns.cns_cst_code  
 AND nvl(CST.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')
 AND GREATEST(CST.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(CST.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999')) ) 
 CST_IDENT, 
 CNS_FREE, 
 CNS_EXC_1141, 
 CNS_CRY_CODE, 
 (SELECT DISTINCT Cry_IDENT FROM country CRY 
 WHERE cns.cns_cry_code = cry_code 
 AND nvl(CRY.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')  
 AND GREATEST(CRY.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(CRY.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999')) ) 
 CRY_IDENT,  
 CNS_TEL_CODE , 
 (SELECT DISTINCT TEL_IDENT FROM TELEPHONY_ADMINISTRATION TEL
 WHERE cns.cns_tel_code = tel_code  
 AND nvl(TEL.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')
 AND GREATEST(TEL.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(TEL.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999'))) 
 TEL_IDENT, 
 CNS_ADD_DIGITS,
 CNS_TIMEOUT, 
 CNS_CVS_CODE,
 CVS_DESC,
 CNS_CVC_CODE, 
 CVC_DESC, 
 CNS_DIGITAL_ONLY,
 CNS_DST_CODE,
 (SELECT DISTINCT DST_IDENT FROM district DST 
 WHERE cns.cns_dst_code = dst_code  AND nvl(DST.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS') 
 AND GREATEST(DST.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'),  NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(DST.end_date,cns.end_date,  NVL(cvs.end_date,'31-DEC-3999'),  NVL(cvc.end_date,'31-DEC-3999')))
 DST_IDENT, 
 CNS_BEFORE_AFTER, 
 CNS_CODE_CHANGE_RULE,
 CNS_CTY_CODE, 
 (SELECT DISTINCT CTY_IDENT FROM call_type CTY 
 WHERE cns.cns_cty_code = cty_code  
 AND nvl(CTY.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS') 
 AND GREATEST(CTY.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'),  NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(CTY.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'),  NVL(cvc.end_date,'31-DEC-3999'))) 
 CTY_IDENT, 
 CNS_NCRF,  
 CNS_OLO_CODE, 
 (SELECT DISTINCT OLO_IDENT FROM other_licensed_operator OLO
 WHERE cns.cns_olo_code = olo_code 
 AND nvl(OLO.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')  
 AND GREATEST(OLO.start_date,cns.start_date, NVL(cvs.start_date,'01-JAN-1900'), NVL(cvc.start_date,'01-JAN-1900'))
 < LEAST(OLO.end_date,cns.end_date, NVL(cvs.end_date,'31-DEC-3999'), NVL(cvc.end_date,'31-DEC-3999'))) 
 OLO_IDENT, 
 CNS_WCC_CODE,  
 CNS_OLO_LOPID, 
 CNS_LUS_BAR_FLAG   FROM cns cns, cns_valid_status cvs, cns_valid_category cvc  
 WHERE cns.cns_cvs_code = cvs_code(+)  index1
 AND cns.cns_cvc_code = cvc_code(+) 
 and greatest(cns.start_date, nvl(cvs.start_date,'01-JAN-1900'), nvl(cvc.start_date,'01-JAN-1900')) 
 < least(cns.end_date,nvl(cvs.end_date,'31-DEC-3999'), nvl(cvc.end_date,'31-DEC-3999'))  
 and nvl(cns.end_date,'31-DEC-3999') > TO_DATE(:V_From_Date,'DD-MON-RRRR HH24:MI:SS')  
 order by cns.cns_ident,1,2; 

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                          |       |       |       |  4855 (100)|          |
|   1 |  HASH UNIQUE                    |                          |     1 |    25 |       |     3  (34)| 00:00:01 |
|   2 |   MAT_VIEW ACCESS BY INDEX ROWID| NUMBER_STRING_TYPE       |     1 |    25 |       |     2   (0)| 00:00:01 |
|   3 |    INDEX RANGE SCAN             | INST_2                   |     1 |       |       |     1   (0)| 00:00:01 |
|   4 |  HASH UNIQUE                    |                          |     1 |    27 |       |     4  (25)| 00:00:01 |
|   5 |   MAT_VIEW ACCESS BY INDEX ROWID| CHARGE_STRUCTURE         |     1 |    27 |       |     3   (0)| 00:00:01 |
|   6 |    INDEX RANGE SCAN             | ICST_1                   |     2 |       |       |     1   (0)| 00:00:01 |
|   7 |  HASH UNIQUE                    |                          |     1 |    25 |       |     3  (34)| 00:00:01 |
|   8 |   MAT_VIEW ACCESS BY INDEX ROWID| COUNTRY                  |     1 |    25 |       |     2   (0)| 00:00:01 |
|   9 |    INDEX RANGE SCAN             | ICRY_1                   |     1 |       |       |     1   (0)| 00:00:01 |
|  10 |  HASH UNIQUE                    |                          |     1 |    33 |       |     3  (34)| 00:00:01 |
|  11 |   MAT_VIEW ACCESS BY INDEX ROWID| TELEPHONY_ADMINISTRATION |     1 |    33 |       |     2   (0)| 00:00:01 |
|  12 |    INDEX RANGE SCAN             | ITEL_2                   |     1 |       |       |     1   (0)| 00:00:01 |
|  13 |  HASH UNIQUE                    |                          |     1 |    23 |       |     3  (34)| 00:00:01 |
|  14 |   MAT_VIEW ACCESS BY INDEX ROWID| DISTRICT                 |     1 |    23 |       |     2   (0)| 00:00:01 |
|  15 |    INDEX RANGE SCAN             | IDST_1                   |     1 |       |       |     1   (0)| 00:00:01 |
|  16 |  HASH UNIQUE                    |                          |     1 |    24 |       |     3  (34)| 00:00:01 |
|  17 |   MAT_VIEW ACCESS BY INDEX ROWID| CALL_TYPE                |     1 |    24 |       |     2   (0)| 00:00:01 |
|  18 |    INDEX RANGE SCAN             | ICTY_1                   |     1 |       |       |     1   (0)| 00:00:01 |
|  19 |  HASH UNIQUE                    |                          |     1 |    27 |       |     4  (25)| 00:00:01 |
|  20 |   MAT_VIEW ACCESS BY INDEX ROWID| OTHER_LICENSED_OPERATOR  |     1 |    27 |       |     3   (0)| 00:00:01 |
|  21 |    INDEX RANGE SCAN             | IOLO_1                   |     2 |       |       |     1   (0)| 00:00:01 |
|  22 |  SORT ORDER BY                  |                          | 35110 |  6411K|    13M|  4855   (2)| 00:00:59 |
|  23 |   FILTER                        |                          |       |       |       |            |          |
|  24 |    HASH JOIN RIGHT OUTER        |                          | 35110 |  6411K|       |  3418   (2)| 00:00:42 |
|  25 |     MAT_VIEW ACCESS FULL        | CNS_VALID_STATUS         |     5 |   140 |       |     3   (0)| 00:00:01 |
|  26 |     HASH JOIN RIGHT OUTER       |                          | 35110 |  5451K|       |  3414   (2)| 00:00:41 |
|  27 |      MAT_VIEW ACCESS FULL       | CNS_VALID_CATEGORY       |     4 |   144 |       |     3   (0)| 00:00:01 |
|  28 |      MAT_VIEW ACCESS FULL       | CNS                      | 35110 |  4217K|       |  3411   (2)| 00:00:41 |
--------------------------------------------------------------------------------------------------------------------

【问题讨论】:

  • 没有查询、没有版本、没有架构和执行计划的一些原始转储?没有机会
  • 请广告:查询、RDBS、数据
  • 除非我遗漏了什么,否则此查询中的每个对象都位于通过数据库链接“实时”访问的远程数据库中。假设您正在显示本地查询计划,Oracle 似乎正在本地提取所有这些对象的所有数据以执行连接。查询计划似乎认为这大约需要一秒钟。需要 4 小时这一事实强烈表明远程数据库中的统计数据非常不正确。您可以在执行此连接的远程数据库中创建一个视图吗?如果是这样,那可能会强制连接远程完成。
  • 不是 Oracle 人,我立即从这个链接想到了相关子查询给你的性能问题(至少在 SQLServer 中),看来它们在 Oracle 中也可能是一个问题。 dba-oracle.com/t_tuning_sql_subqueries.htm
  • 我正在从同一个数据库(实时)执行查询。但是我们也可以远程运行它。您能否建议此查询的性能改进方法?

标签: sql oracle10g sql-execution-plan


【解决方案1】:

根据 Justin 在 cmets 中的观察,您可能会使用 DRIVING_SITE 提示进行调查,以在远程数据库中执行查询。

http://docs.oracle.com/database/121/SQLRF/sql_elements006.htm#BABEGIJC

【讨论】:

  • 我正在从同一个数据库(实时)执行查询。但是我们也可以远程运行它。您能否建议此查询的性能改进方法?
  • 我建议您查看事件跟踪,它可以准确地细分数据库中的哪些事件导致查询运行四个小时。
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
相关资源
最近更新 更多