![](https://img-blog.csdn.net/20141113082246671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhbmdqaWFuNzI0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
硬解析每秒 33.29次太高
cowork_czsh@OA_PRIMA> select sql_id,version_count from v$sqlarea where version_count >500 order by 2 desc;
SQL_ID VERSION_COUNT
------------- -------------
0mt5f81n6a1c3 1016
33rnq8nr6f5wp 1003
9bvh1c40vjqk7 864
5jmc0s3sq8mc6 778
13kk0unhbrdpf 727
8zst2rj9vkzkk 662
1mnrjx3qknhjp 599
g5k3qzz7jtm85 544
8 rows selected.
可以看到如果version_count 如果有1016个版本,那么需要遍历1016个子游标,效率不高。
如果遍历1016个子游标,还是没有找到,最后还是要硬解析,那效率就更低
sys@OA_PRIMA> select sql_text from v$sqlarea where sql_id='0mt5f81n6a1c3';
SQL_TEXT
----------------------------------------------------------------------------------------------------
insert into workitem_run (domain, caseid, batch, itemnum, name, casename, processid, processindex, p
rocessname, activityid, activityname, performer, finisher, owner, nextstatus, nextlinkid, oldstate,
levelnum, canReAssign, canReturn, canDelegate, canEntrust, canReview, entruster, delegater, state, c
reatedate, updatedate, deadline, datamap, id) values (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11,
:12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24, :25, :26, :27, :28, :29, :30, :31)
sys@OA_PRIMA> select SQL_ID,CHILD_NUMBER from v$sql where sql_id='33rnq8nr6f5wp';
SQL_ID CHILD_NUMBER
------------- ------------
33rnq8nr6f5wp 999
33rnq8nr6f5wp 1000
33rnq8nr6f5wp 1003
当有大量的version_count,说明虽然SQL语句相同,但是ORACLE发现某些原因导致SQL不可重用,这类SQL执行次数很多,就会战中大量的shared pool
查看SQL时什么原因导致不能匹配;
cowork_czsh@OA_PRIMA> select sql_id,child_number,bind_mismatch from v$sql_shared_cursor where sql_id='0mt5f81n6a1c3';
SQL_ID CHILD_NUMBER BIND_MISMATCH
------------- ------------ ---------------------------------------------
0mt5f81n6a1c3 1009 Y
0mt5f81n6a1c3 1013 Y
0mt5f81n6a1c3 1015 N
通过v$sql_bind_capture视图查看每次绑定变量的值:
sys@OA_PRIMA> Select position,last_captured,datatype_string,value_string from v$sql_bind_capture where sql_id='9bvh1c40vjqk7' and value_string is not null;
POSITION LAST_CAPTURED DATATYPE_STRING VALUE_STRING
---------- ------------------- ------------------------------ ------------------------------
62 2013-06-13 12:52:42 VARCHAR2(128) 441905_HumenNode_3_0
62 2013-06-13 08:30:21 VARCHAR2(128) 441405_HumenNode_3
直接在shared pool链表上找不到可以使用的子游标 最后还是要硬解析的
这种insert没必要带入这么多变量。
一般insert的绑定变量很少有能share的。
所以不推荐使用绑定变量。尤其对于字段很多的表。
sys@OA_PRIMA> l
1 SELECT SUBSTR(sql_text,1, 60), COUNT(*)
2 FROM V$SQLAREA
3 WHERE executions = 1
4 GROUP BY SUBSTR(sql_text, 1, 60)
5 HAVING COUNT(*) > 1
6* order by COUNT(*) desc
sys@OA_PRIMA> SELECT SUBSTR(sql_text,1, 60), COUNT(*)
2 FROM V$SQLAREA
3 WHERE executions = 1
4 GROUP BY SUBSTR(sql_text, 1, 60)
5 HAVING COUNT(*) > 1
6 order by COUNT(*) desc;
SUBSTR(SQL_TEXT,1,60) COUNT(*)
------------------------------------------------------------------------------------------------------------------------ ----------
select formcase0_.ID as ID, formcase0_.FORM_ID as FORM_ID, f 104
select workitemru0_.ID as ID363_, workitemru0_.CASEID as CAS 54
select fileinfo0_.ID as ID342_, fileinfo0_.OBJECT_ID as OBJE 54
select objectlock0_.ID as ID343_, objectlock0_.OBJECT_ID as 28
select orggroup0_.ID as ID378_, orggroup0_.SORTINDEX as SORT 14
select peraffouts0_.FROM_USERNAME as col_0_0_ from PERAFF_OU 13
select * from ( select pubformdat0_.ID as ID358_, pubformdat 11
select count(*) as col_0_0_ from WF_PUB_FORM_DATA pubformdat 11
select workitemru0_.ID as col_0_0_ from WORKITEM_RUN workite 9
select * from ( select pubformdat0_.ID as ID358_0_, pubformc 9
select pubformdat0_.ID as ID358_0_, pubformcas1_.ID as ID356 7
select formdocume0_.ID as ID348_, formdocume0_.FORMID as FOR 6
select distinct workitemru0_.PERFORMER as col_0_0_ from WORK 4
select documentfi0_.FILEID as FILEID346_, documentfi0_.RECOR 3
select formbutton0_.ID as ID, formbutton0_.CREATEWORDZW_FALG 2
select sawordnoco0_.ID as ID396_, sawordnoco0_.WORDNO_ID as 2
select workitemhi0_.ID as ID364_, workitemhi0_.CASEID as CAS 2
select workitemhi0_.ID as col_0_0_ from WORKITEM_HISTORY wor 2
18 rows selected.
sys@OA_PRIMA> select sql_id,version_count from v$sqlarea where version_count >1;
SQL_ID VERSION_COUNT
------------- -------------
a2wbjpyw20bpf 2
1mnrjx3qknhjp 3
1aahxhc0t8hyp 3
04xtrk7uyhknh 2
5jmc0s3sq8mc6 3
abk3kwx2ncydf 2
83taa7kaw59c1 2
fhjwhqrt9jat2 4
byfttmqyrxf8h 3
g3rf75mb31fgb 3
g5k3qzz7jtm85 3
g337099aatnuj 2
9bvh1c40vjqk7 2
9huz0nndcxs4p 2
fz8x3gmsj1u4r 2
7216v4896jyp1 2
384k6g2kbtz2n 2
9p6bq1v54k13j 3
0mt5f81n6a1c3 2
7pdq21uwxu2yt 2
33rnq8nr6f5wp 2
gufqfk7ahyadt 2
4dufcndu3ahzv 6
gcduyfhnbyn51 4
7ng34ruy5awxq 2
8zst2rj9vkzkk 3
1gu8t96d0bdmu 2
13kk0unhbrdpf 3
1agt4gvym7dxs 2
1vf92qxcv7gm8 2
17v9vt4hbgt41 2
57xk7bhu5zt4k 2
0rcsncdd7bub8 2
6ng0ugcrw7wth 2
dcstr36r0vz0d 2
35 rows selected.