【发布时间】: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