当SQL 语句第一次执行时,在硬解析时,会创建parent cursor 和child cursor。当再次执行这个SQL时,Oracle 会先对SQL 语句进行hash 运算,产生一个hash 值,然后用这个HASH 值到buckets里去查找,hash value 存放在parent cursor里。 如果找到了,就去检查child cursor。 如果可以重用这个child cursor,那么就直接调用cursor里的执行计划。 如果不可重用,就会创建一个新的child cursor。 这个child cursor 的个数,就是version count。 不同parent cursor 对应的child cursor 越多,version count 就越高。
减少硬解析可以使用绑定变量,使用绑定变量之后,oracle解析的hash值一致,所以parent cursor相同,如果需要减少软解析,可以设置session_cached_cursors为更大值,这样就能重用child cursor,10G数据库在使用绑定变量时,最好不要收集直方图。
v$sqlarea是父游标相关信息视图,v$sql是子游标的。
select sql_id,version_count from v$sqlarea order by 2 desc;
version_count代表子游标个数
select address,child_address,sql_text from v$sqlwheresql_id='dfnz16gh72bwg';
查看绑定变量值:
1.通过v$sql_bind_capture,dba_hist_sqlbind获得sql的绑定变量
SQL> set linesize 180
SQL> col var for a20
SQL> col var_value for a40
SQL> select name var,value_string var_value,sql_id,hash_value,to_char(last_captured,'yyyy-mm-dd hh24:mi:ss') from v$sql_bind_capture where sql_id='dfnz16gh72bwg';
VAR VAR_VALUE SQL_ID HASH_VALUE TO_CHAR(LAST_CAPTUR
-------------------- ---------------------------------------- ------------- ---------- -------------------
:B 100 dfnz16gh72bwg 3765514127 2014-01-14 09:42:35
:A 90 dfnz16gh72bwg 3765514127 2014-01-14 09:42:35
:B 100 dfnz16gh72bwg 3765514127 2014-01-14 09:30:29
:A 90 dfnz16gh72bwg 3765514127 2014-01-14 09:30:29
V$SQL_BIND_CAPTURE只能捕获where和having后的绑定变量:
SQL> col value_string for a40
SQL> select snap_id, name, position, value_string,last_captured,to_char(last_captured,'yyyy-mm-dd hh24:mi:ss') from dba_hist_sqlbind where sql_id= 'dfnz16gh72bwg';
SNAP_ID NAME POSITION VALUE_STRING LAST_CAPTURE TO_CHAR(LAST_CAPTUR
---------- ------------------------------ ---------- ---------------------------------------- ------------ -------------------
273 :B 1 100 14-JAN-14 2014-01-14 09:42:35
273 :A 2 90 14-JAN-14 2014-01-14 09:42:35
2.通过dbms_xplans查看sql的绑定变量
set linesize 180
select * from TABLE(dbms_xplan.display_cursor('dfnz16gh72bwg',NULL,'PEEKED_BINDS'));
Peeked Binds (identified by position):
--------------------------------------
1 - :B (NUMBER): 100
select * from TABLE(dbms_xplan.display_awr('dfnz16gh72bwg',null,null,'PEEKED_BINDS'));
PLAN_TABLE_OUTPUT
---------------------------------------------------------
1 - :B (NUMBER): 100