一条SQL执行接近两分钟,一看便知子查询非常多,可以先使用调优利器dbms_xplan.display_cursor。
SQL>alter session set statistics_level=all;
SQL>set pagesize 100
SQL>SELECT *
FROM (SELECT unpaged_.*, rownum rn_
FROM (select t2.*,
(select cs.system_name
from cfms_sys cs
where cs.sys_id = t2.system_id) as system_name,
(select m.name
from cfms_module m
where m.module_id = t2.module_id) as module_name,
(select count(1)
from cfms_replys cr
where cr.question_id = t2.id) reply_count,
(select v.version_no
from cfms_versions v
where v.version_id = t2.ps_online_version) as ps_online_version_no,
(select to_char(wmsys.wm_concat(t.tag_id || ';' ||
t.name))
from cfms_tag t, cfms_tag_question tq
where t2.id = tq.question_id
and t.tag_id = tq.tag_id) as tags,
(select u.name
from v_user u
where u.user_id = t2.service_id) as service_name,
(select max(m.modify_at)
from cfms_question_modify m
where m.question_id = t2.id) as modify_at,
decode((select count(1)
from cfms_questions cq,
cfms_question_workflow cqw,
bpms_ru_todo_task brtt
where cq.id = cqw.question_id
and cqw.process_ins_id =
brtt.cur_process_ins_id
and cq.id = t2.id
and brtt.trans_actor_id = 'N00251.sz'),
0,
0,
1) as can_handle
from cfms_questions t2
where t2.state <> -1
and exists
(select 1
from cfms_questions cq,
cfms_question_workflow cqw,
bpms_ru_todo_task brtt
where cq.id = cqw.question_id
and cqw.process_ins_id = brtt.cur_process_ins_id
and cq.id = t2.id
and brtt.trans_actor_id = 'N00251.sz')
order by t2.discover_time desc, t2.id) unpaged_
WHERE rownum <= 30)
WHERE rn_ > 20;
已用时间: 00: 01: 53.13
SQL>select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
关于下面列的解释,请看http://blog.csdn.net/stevendbaguo/article/details/13776221 ,初步判断子查询次数太多(看Starts便知),很多表都是全表扫描太多次导致。对相应的表加上索引后,有些子查询还是很慢,现在不得不使用神器10046 。
----------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:01:59.41 | 2244K| | | |
| 1 | TABLE ACCESS BY INDEX ROWID | CFMS_SYS | 3 | 1 | 3 |00:00:00.01 | 5 | | | |
|* 2 | INDEX UNIQUE SCAN | CFMS_SYS_PK | 3 | 1 | 3 |00:00:00.01 | 2 | | | |
| 3 | TABLE ACCESS BY INDEX ROWID | CFMS_MODULE | 5 | 1 | 4 |00:00:00.01 | 6 | | | |
|* 4 | INDEX UNIQUE SCAN | CFMS_MODUL | 5 | 1 | 4 |00:00:00.01 | 2 | | | |
| 5 | SORT AGGREGATE | | 4368 | 1 | 4368 |00:00:00.29 | 26208 | | | |
|* 6 | TABLE ACCESS FULL | CFMS_REPLYS | 4368 | 3 | 0 |00:00:00.25 | 26208 | | | |
|* 7 | TABLE ACCESS FULL | CFMS_VERSIONS | 1 | 1 | 0 |00:00:00.01 | 6 | | | |
| 8 | SORT AGGREGATE | | 4368 | 1 | 4368 |00:00:01.08 | 26208 | | | |
|* 9 | HASH JOIN | | 4368 | 5 | 0 |00:00:00.58 | 26208 | 821K| 821K| 221K (0)|
|* 10 | TABLE ACCESS FULL | CFMS_TAG_QUESTION | 4368 | 5 | 0 |00:00:00.19 | 26208 | | | |
| 11 | TABLE ACCESS FULL | CFMS_TAG | 0 | 9 | 0 |00:00:00.01 | 0 | | | |
| 12 | MAT_VIEW ACCESS BY INDEX ROWID| V_USER | 3 | 1 | 2 |00:00:00.01 | 5 | | | |
|* 13 | INDEX UNIQUE SCAN | PK_PUB_USER | 3 | 1 | 2 |00:00:00.01 | 3 | | | |
| 14 | SORT AGGREGATE | | 4368 | 1 | 4368 |00:00:03.24 | 262K| | | |
|* 15 | TABLE ACCESS FULL | CFMS_QUESTION_MODIFY | 4368 | 1 | 4378 |00:00:03.16 | 262K| | | |
| 16 | SORT AGGREGATE | | 4368 | 1 | 4368 |00:01:54.25 | 1928K| | | |
|* 17 | HASH JOIN | | 4368 | 1 | 4369 |00:01:54.19 | 1928K| 894K| 894K| 381K (0)|
| 18 | NESTED LOOPS | | 4368 | 1 | 4371 |00:00:03.04 | 268K| | | |
|* 19 | INDEX UNIQUE SCAN | CFMS_QUESTIONS | 4368 | 1 | 4368 |00:00:00.09 | 6304 | | | |
|* 20 | TABLE ACCESS FULL | CFMS_QUESTION_WORKFLOW | 4368 | 1 | 4371 |00:00:02.87 | 262K| | | |
|* 21 | TABLE ACCESS FULL | BPMS_RU_TODO_TASK | 4368 | 1424 | 19M|00:00:33.73 | 1659K| | | |
|* 22 | VIEW | | 1 | 1 | 10 |00:01:59.41 | 2244K| | | |
|* 23 | COUNT STOPKEY | | 1 | | 30 |00:01:59.41 | 2244K| | | |
| 24 | VIEW | | 1 | 1 | 30 |00:01:59.41 | 2244K| | | |
|* 25 | SORT ORDER BY STOPKEY | | 1 | 1 | 30 |00:01:59.41 | 2244K| 80896 | 80896 |71680 (0)|
|* 26 | HASH JOIN RIGHT SEMI | | 1 | 1 | 4368 |00:00:00.33 | 2065 | 1049K| 1049K| 1413K (0)|
| 27 | VIEW | VW_SQ_1 | 1 | 1424 | 4377 |00:00:00.21 | 1811 | | | |
| 28 | NESTED LOOPS | | 1 | 1424 | 4377 |00:00:00.19 | 1811 | | | |
|* 29 | HASH JOIN | | 1 | 1424 | 4377 |00:00:00.11 | 440 | 974K| 974K| 1446K (0)|
|* 30 | TABLE ACCESS FULL | BPMS_RU_TODO_TASK | 1 | 1424 | 4386 |00:00:00.01 | 380 | | | |
| 31 | TABLE ACCESS FULL | CFMS_QUESTION_WORKFLOW | 1 | 1674 | 5201 |00:00:00.02 | 60 | | | |
|* 32 | INDEX UNIQUE SCAN | CFMS_QUESTIONS | 4377 | 1 | 4377 |00:00:00.04 | 1371 | | | |
|* 33 | TABLE ACCESS FULL | CFMS_QUESTIONS | 1 | 3774 | 5163 |00:00:00.04 | 254 | | | |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CS"."SYS_ID"=:B1)
4 - access("M"."MODULE_ID"=:B1)
6 - filter("CR"."QUESTION_ID"=:B1)
7 - filter("V"."VERSION_ID"=:B1)
9 - access("T"."TAG_ID"="TQ"."TAG_ID")
10 - filter("TQ"."QUESTION_ID"=:B1)
13 - access("U"."USER_ID"=:B1)
15 - filter("M"."QUESTION_ID"=:B1)
17 - access("CQW"."PROCESS_INS_ID"="BRTT"."CUR_PROCESS_INS_ID")
19 - access("CQ"."ID"=:B1)
20 - filter("CQW"."QUESTION_ID"=:B1)
21 - filter("BRTT"."TRANS_ACTOR_ID"='N00251.sz')
22 - filter("RN_">20)
23 - filter(ROWNUM<=30)
25 - filter(ROWNUM<=30)
26 - access("ITEM_1"="T2"."ID")
29 - access("CQW"."PROCESS_INS_ID"="BRTT"."CUR_PROCESS_INS_ID")
30 - filter("BRTT"."TRANS_ACTOR_ID"='N00251.sz')
32 - access("CQ"."ID"="CQW"."QUESTION_ID")
33 - filter("T2"."STATE"<>(-1))
10046trace的结果是(如何使用10046请看我以前的blog),通过神器10046一眼就可以看出是对BPMS_RU_TODO_TASK这个子查询查询太多次,表了也有点大:
Rows Row Source Operation
------- ---------------------------------------------------
3 TABLE ACCESS BY INDEX ROWID CFMS_SYS (cr=5 pr=0 pw=0 time=156 us cost=1 size=52 card=1)
3 INDEX UNIQUE SCAN CFMS_SYS_PK (cr=2 pr=0 pw=0 time=70 us cost=0 size=0 card=1)(object id 132684)
4 TABLE ACCESS BY INDEX ROWID CFMS_MODULE (cr=6 pr=0 pw=0 time=161 us cost=1 size=50 card=1)
4 INDEX UNIQUE SCAN CFMS_MODUL (cr=2 pr=0 pw=0 time=70 us cost=0 size=0 card=1)(object id 132664)
4370 SORT AGGREGATE (cr=3 pr=0 pw=0 time=84950 us)
0 INDEX RANGE SCAN IND_CR_QUESTION_ID (cr=3 pr=0 pw=0 time=48849 us cost=1 size=51 card=3)(object id 134801)
0 TABLE ACCESS FULL CFMS_VERSIONS (cr=6 pr=0 pw=0 time=85 us cost=3 size=42 card=1)
4370 SORT AGGREGATE (cr=4370 pr=0 pw=0 time=986114 us)
0 HASH JOIN (cr=4370 pr=0 pw=0 time=499642 us cost=7 size=485 card=5)
0 TABLE ACCESS BY INDEX ROWID CFMS_TAG_QUESTION (cr=4370 pr=0 pw=0 time=128932 us cost=3 size=270 card=5)
0 INDEX RANGE SCAN IND_TQ_QUESTION_ID (cr=4370 pr=0 pw=0 time=57400 us cost=1 size=0 card=5)(object id 134802)
0 TABLE ACCESS FULL CFMS_TAG (cr=0 pr=0 pw=0 time=0 us cost=3 size=387 card=9)
2 MAT_VIEW ACCESS BY INDEX ROWID V_USER (cr=5 pr=0 pw=0 time=137 us cost=2 size=17 card=1)
2 INDEX UNIQUE SCAN PK_PUB_USER (cr=3 pr=0 pw=0 time=81 us cost=1 size=0 card=1)(object id 134599)
4370 SORT AGGREGATE (cr=4034 pr=0 pw=0 time=236040 us)
4380 TABLE ACCESS BY INDEX ROWID CFMS_QUESTION_MODIFY (cr=4034 pr=0 pw=0 time=184813 us cost=4 size=26 card=1)
4380 INDEX RANGE SCAN IND_QM_QUESTION_ID (cr=1873 pr=0 pw=0 time=72275 us cost=1 size=0 card=3)(object id 134803)
4370 SORT AGGREGATE (cr=1673138 pr=0 pw=0 time=106229115 us)
4371 HASH JOIN (cr=1673138 pr=0 pw=0 time=106172615 us cost=32 size=118 card=1)
4373 NESTED LOOPS (cr=16908 pr=0 pw=0 time=294422 us cost=4 size=71 card=1)
4370 INDEX UNIQUE SCAN CFMS_QUESTIONS (cr=6308 pr=0 pw=0 time=70360 us cost=1 size=17 card=1)(object id 132669)
4373 TABLE ACCESS BY INDEX ROWID CFMS_QUESTION_WORKFLOW (cr=10600 pr=0 pw=0 time=164442 us cost=3 size=54 card=1)
4373 INDEX RANGE SCAN IND_QW_QUESTION_ID (cr=6230 pr=0 pw=0 time=59792 us cost=1 size=0 card=1)(object id 134804)
19175560 TABLE ACCESS FULL BPMS_RU_TODO_TASK (cr=1656230 pr=0 pw=0 time=32077237 us cost=27 size=66928 card=1424)
10 VIEW (cr=1683632 pr=0 pw=0 time=108051153 us cost=104 size=4407 card=1)
30 COUNT STOPKEY (cr=1683632 pr=0 pw=0 time=108051028 us)
30 VIEW (cr=1683632 pr=0 pw=0 time=108050887 us cost=104 size=4394 card=1)
30 SORT ORDER BY STOPKEY (cr=1683632 pr=0 pw=0 time=108050758 us cost=104 size=375 card=1)
4370 HASH JOIN RIGHT SEMI (cr=2065 pr=0 pw=0 time=325742 us cost=103 size=375 card=1)
4379 VIEW VW_SQ_1 (cr=1812 pr=0 pw=0 time=206454 us cost=35 size=24208 card=1424)
4379 NESTED LOOPS (cr=1812 pr=0 pw=0 time=188877 us cost=35 size=168032 card=1424)
4379 HASH JOIN (cr=439 pr=0 pw=0 time=102674 us cost=35 size=143824 card=1424)
4388 TABLE ACCESS FULL BPMS_RU_TODO_TASK (cr=379 pr=0 pw=0 time=14081 us cost=27 size=66928 card=1424)
5206 TABLE ACCESS FULL CFMS_QUESTION_WORKFLOW (cr=60 pr=0 pw=0 time=13333 us cost=7 size=90396 card=1674)
4379 INDEX UNIQUE SCAN CFMS_QUESTIONS (cr=1373 pr=0 pw=0 time=40158 us cost=0 size=17 card=1)(object id 132669)
5168 TABLE ACCESS FULL CFMS_QUESTIONS (cr=253 pr=0 pw=0 time=42738 us cost=68 size=1351092 card=3774)
定位到了问题就简单了,这是一个分页SQL,降低子查询的次数即可,将子查询提出来,则每次都只执行10次,执行时间立马将下来0.75s。
SQL> SELECT (select cs.system_name
2 from cfms_sys cs
3 where cs.sys_id = unpaged.system_id) as system_name,
4 (select m.name
5 from cfms_module m
6 where m.module_id = unpaged.module_id) as module_name,
7 (select count(1)
8 from cfms_replys cr
9 where cr.question_id = unpaged.id) reply_count,
10 (select v.version_no
11 from cfms_versions v
12 where v.version_id = unpaged.ps_online_version) as ps_online_version_no,
13 (select to_char(wmsys.wm_concat(t.tag_id || ';' || t.name))
14 from cfms_tag t, cfms_tag_question tq
15 where unpaged.id = tq.question_id
16 and t.tag_id = tq.tag_id) as tags,
17 (select u.name from v_user u where u.user_id = unpaged.service_id) as service_name,
18 (select max(m.modify_at)
19 from cfms_question_modify m
20 where m.question_id = unpaged.id) as modify_at,
21 decode((select count(1)
22 from cfms_questions cq,
23 cfms_question_workflow cqw,
24 bpms_ru_todo_task brtt
25 where cq.id = cqw.question_id
26 and cqw.process_ins_id = brtt.cur_process_ins_id
27 and cq.id = unpaged.id
28 and brtt.trans_actor_id = 'N00251.sz'),
29 0,
30 0,
31 1) as can_handle
32 FROM (SELECT unpaged_.*, rownum rn_
33 FROM (select t2.*
34 from cfms_questions t2
35 where t2.state <> -1
36 and exists
37 (select 1
38 from cfms_questions cq,
39 cfms_question_workflow cqw,
40 bpms_ru_todo_task brtt
41 where cq.id = cqw.question_id
42 and cqw.process_ins_id = brtt.cur_process_ins_id
43 and cq.id = t2.id
44 and brtt.trans_actor_id = 'N00251.sz')
45 order by t2.discover_time desc, t2.id) unpaged_
46 WHERE rownum <= 30) unpaged
47 WHERE rn_ > 20;
已选择10行。
已用时间: 00: 00: 00.75
执行计划
----------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.31 | 2067 | | | |
| 1 | TABLE ACCESS BY INDEX ROWID | CFMS_SYS | 1 | 1 | 1 |00:00:00.01 | 2 | | | |
|* 2 | INDEX UNIQUE SCAN | CFMS_SYS_PK | 1 | 1 | 1 |00:00:00.01 | 1 | | | |
| 3 | TABLE ACCESS BY INDEX ROWID | CFMS_MODULE | 1 | 1 | 0 |00:00:00.01 | 0 | | | |
|* 4 | INDEX UNIQUE SCAN | CFMS_MODUL | 1 | 1 | 0 |00:00:00.01 | 0 | | | |
| 5 | SORT AGGREGATE | | 10 | 1 | 10 |00:00:00.01 | 3 | | | |
|* 6 | INDEX RANGE SCAN | IND_CR_QUESTION_ID | 10 | 3 | 0 |00:00:00.01 | 3 | | | |
|* 7 | TABLE ACCESS FULL | CFMS_VERSIONS | 1 | 1 | 0 |00:00:00.01 | 6 | | | |
| 8 | SORT AGGREGATE | | 10 | 1 | 10 |00:00:00.01 | 10 | | | |
|* 9 | HASH JOIN | | 10 | 5 | 0 |00:00:00.01 | 10 | 821K| 821K| 176K (0)|
| 10 | TABLE ACCESS BY INDEX ROWID | CFMS_TAG_QUESTION | 10 | 5 | 0 |00:00:00.01 | 10 | | | |
|* 11 | INDEX RANGE SCAN | IND_TQ_QUESTION_ID | 10 | 5 | 0 |00:00:00.01 | 10 | | | |
| 12 | TABLE ACCESS FULL | CFMS_TAG | 0 | 9 | 0 |00:00:00.01 | 0 | | | |
| 13 | MAT_VIEW ACCESS BY INDEX ROWID| V_USER | 1 | 1 | 0 |00:00:00.01 | 0 | | | |
|* 14 | INDEX UNIQUE SCAN | PK_PUB_USER | 1 | 1 | 0 |00:00:00.01 | 0 | | | |
| 15 | SORT AGGREGATE | | 10 | 1 | 10 |00:00:00.01 | 16 | | | |
| 16 | TABLE ACCESS BY INDEX ROWID | CFMS_QUESTION_MODIFY | 10 | 1 | 10 |00:00:00.01 | 16 | | | |
|* 17 | INDEX RANGE SCAN | IND_QM_QUESTION_ID | 10 | 3 | 10 |00:00:00.01 | 8 | | | |
| 18 | SORT AGGREGATE | | 10 | 1 | 10 |00:00:00.42 | 3840 | | | |
|* 19 | HASH JOIN | | 10 | 1 | 10 |00:00:00.42 | 3840 | 894K| 894K| 384K (0)|
| 20 | NESTED LOOPS | | 10 | 1 | 10 |00:00:00.01 | 40 | | | |
|* 21 | INDEX UNIQUE SCAN | CFMS_QUESTIONS | 10 | 1 | 10 |00:00:00.01 | 15 | | | |
| 22 | TABLE ACCESS BY INDEX ROWID| CFMS_QUESTION_WORKFLOW | 10 | 1 | 10 |00:00:00.01 | 25 | | | |
|* 23 | INDEX RANGE SCAN | IND_QW_QUESTION_ID | 10 | 1 | 10 |00:00:00.01 | 15 | | | |
|* 24 | TABLE ACCESS FULL | BPMS_RU_TODO_TASK | 10 | 1424 | 43880 |00:00:00.12 | 3800 | | | |
|* 25 | VIEW | | 1 | 1 | 10 |00:00:00.31 | 2067 | | | |
|* 26 | COUNT STOPKEY | | 1 | | 30 |00:00:00.31 | 2067 | | | |
| 27 | VIEW | | 1 | 1 | 30 |00:00:00.31 | 2067 | | | |
|* 28 | SORT ORDER BY STOPKEY | | 1 | 1 | 30 |00:00:00.31 | 2067 | 6144 | 6144 | 6144 (0)|
|* 29 | HASH JOIN RIGHT SEMI | | 1 | 1 | 4370 |00:00:00.30 | 2067 | 1063K| 1063K| 1414K (0)|
| 30 | VIEW | VW_SQ_1 | 1 | 1424 | 4379 |00:00:00.21 | 1813 | | | |
| 31 | NESTED LOOPS | | 1 | 1424 | 4379 |00:00:00.19 | 1813 | | | |
|* 32 | HASH JOIN | | 1 | 1424 | 4379 |00:00:00.11 | 440 | 974K| 974K| 1439K (0)|
|* 33 | TABLE ACCESS FULL | BPMS_RU_TODO_TASK | 1 | 1424 | 4388 |00:00:00.01 | 380 | | | |
| 34 | TABLE ACCESS FULL | CFMS_QUESTION_WORKFLOW | 1 | 1674 | 5217 |00:00:00.01 | 60 | | | |
|* 35 | INDEX UNIQUE SCAN | CFMS_QUESTIONS | 4379 | 1 | 4379 |00:00:00.04 | 1373 | | | |
|* 36 | TABLE ACCESS FULL | CFMS_QUESTIONS | 1 | 3774 | 5179 |00:00:00.02 | 254 | | | |
----------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CS"."SYS_ID"=:B1)
4 - access("M"."MODULE_ID"=:B1)
6 - access("CR"."QUESTION_ID"=:B1)
7 - filter("V"."VERSION_ID"=:B1)
9 - access("T"."TAG_ID"="TQ"."TAG_ID")
11 - access("TQ"."QUESTION_ID"=:B1)
14 - access("U"."USER_ID"=:B1)
17 - access("M"."QUESTION_ID"=:B1)
19 - access("CQW"."PROCESS_INS_ID"="BRTT"."CUR_PROCESS_INS_ID")
21 - access("CQ"."ID"=:B1)
23 - access("CQW"."QUESTION_ID"=:B1)
24 - filter("BRTT"."TRANS_ACTOR_ID"='N00251.sz')
25 - filter("RN_">20)
26 - filter(ROWNUM<=30)
28 - filter(ROWNUM<=30)
29 - access("ITEM_1"="T2"."ID")
32 - access("CQW"."PROCESS_INS_ID"="BRTT"."CUR_PROCESS_INS_ID")
33 - filter("BRTT"."TRANS_ACTOR_ID"='N00251.sz')
35 - access("CQ"."ID"="CQW"."QUESTION_ID")
36 - filter("T2"."STATE"<>(-1))