【发布时间】:2014-09-04 07:48:23
【问题描述】:
我有一个需要很长时间才能执行的查询。我尝试使用提示并在 where 子句中的列上创建索引,但没有帮助。根据解释计划,聚合函数需要更多成本,对我来说,拥有它们是绝对必要的。反正我可以调吗?
INSERT
INTO tab3
(CDE,
SOURCE,
SCENARIO,
ID_COUNT,
AMOUNT)
SELECT /*+ parallel(t,8) */ 'BENEFICIARY' AS CDE, 'MTS' AS SOURCE,'Match on Value' AS SCENARIO,COUNT(T.BA1) AS ID_COUNT,SUM(T.AMT) AS AMOUNT
FROM tab1 E
JOIN tab2 T
ON E.AA1 = T.BA1
WHERE (CASE WHEN E.AF1 = 'Y'
THEN replace_word(E.AF2)
ELSE replace_word(E.AF3)
END) = UPPER(TRIM(T.BF1))
AND E.AF5 = '001'
AND E.AF6 = 'Y'
AND T.BF2 = '001';
如果我将此查询作为过程的一部分并选择查询作为游标,然后使用批量收集插入到 tab3,会有帮助吗?在此先感谢您的时间。我们的数据库是 Oracle 11g。
编辑: 添加上述查询的解释计划:
-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 127 | | 1458K (1)| 04:51:40 |
| 1 | LOAD TABLE CONVENTIONAL | tab3 | | | | | |
| 2 | SORT AGGREGATE | | 1 | 127 | | | |
|* 3 | HASH JOIN | | 10005 | 1240K| 76M| 1458K (1)| 04:51:40 |
|* 4 | TABLE ACCESS BY INDEX ROWID| tab1 | 1000K| 64M| | 432K (1)| 01:26:33 |
|* 5 | INDEX RANGE SCAN | IDX_AF5 | 2000K| | | 4483 (1)| 00:00:54 |
|* 6 | TABLE ACCESS FULL | AF5 | 3538K| 199M| | 1009K (1)| 03:22:00 |
-------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(CASE "E"."AF1" WHEN 'Y' THEN "REPLACE_WORD"("E"."AF2") ELSE
"REPLACE_WORD"("E"."AF3") END =UPPER(TRIM("T"."BF1")) AND
"E"."AA1"="T"."BA1")
4 - filter("E"."AF6"='Y')
5 - access("E"."AF5"='001')
6 - filter("T"."BF2"='001')
【问题讨论】:
-
请显示
replace_word函数的代码 -
永远记住,SQL 比 PL/SQL 快。所以,不要考虑在 PL/SQL 中执行当前的 SQL。正如 zaratustra 已经询问过用户定义的函数 replace_word ,此外,您真的需要使用函数 TRIM 和 UPPER 吗?如有任何与性能相关的问题,请务必发布执行计划。
-
@zaratustra replace_word 是一个非常简单的删除垃圾字符的函数,而且不消耗资源。
-
@Sid,请发布执行计划。
-
您发布了显示您估计的解释计划。要获得真正的执行计划,请执行以下操作:“alter session set statistics_level = all”,运行您的插入语句,然后执行“select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))”
标签: sql oracle performance