SQL> select s.sid, ss.value, s.logon_time, s.service_name, s.program
2 from v$session s,
3 v$statname sn,
4 v$sesstat ss
5 where sn.name='session cursor cache count'
6 and ss.statistic#=sn.statistic#
7 and ss.value > 100
8 and s.sid=ss.sid;
SID VALUE LOGON_TIME SERVICE_NAME PROGRAM
---------- ---------- ------------------- ------------ ----------------
485 255 19.05.2015 02:47:52 dp_task JDBC Thin Client
705 12774 19.05.2015 02:47:51 dp_task JDBC Thin Client
800 267 19.05.2015 02:47:51 dp_task JDBC Thin Client
session_cached_cursors parameter has default value of 50.
My first thought was that sessions changed session_cached_cursors parameter.
To confirm my hypothesis, I executed below oradebug command:
oradebug dump modified_parameters 1Looking into trace file:
Received ORADEBUG command (#1) 'dump modified_parameters 1' from process 'Unix process pid: 13761, image: <none>' DYNAMICALLY MODIFIED PARAMETERS: nls_language = AMERICAN nls_territory = AMERICA log_archive_dest_state_3 = ENABLE service_names = drep_dp_stat, drep_dp_task, drep_ora_at, drep_dp_core *** 2015-05-14 10:44:20.744 Finished processing ORADEBUG command (#1) 'dump modified_parameters 1'So session_cached_cursors parameter wasn't changed by session. At the next step I decided to dump all cursors cached by session:
oradebug dump cursordump 1Here is a relevant portion of trace file:
----- Session Cached Cursor Dump ----- ----- Generic Session Cached Cursor Dump ----- ----------------------------------------------------------- -------------- Generic Session Cached Cursors Dump -------- ----------------------------------------------------------- hash table=ffffffff79d34228 cnt=50 LRU=ffffffff79d245f0 cnt=49 hit=64510 max=50 NumberOfTypes=6From the above, there was no doubt that 'session cursor cache count' statistic is lying. I opened SR with Oracle and support engineer pointed to a Bug 5713223 : 'SESSION CURSOR CACHE COUNT' OF V$SYSSTAT IS NOT CURRENT VALUE
This bug was opened in 2006 for 10.2 version and still not resolved yet.
I have couple of SR with Oracle in which I waiting for resolution of such long-lived bugs. So, I decided to further diagnose this issue and provide additional information to the Oracle Support. All of the sessions are using dp_task database service. I created this service for reporting application that executes bunch of heavy SQL.
I wrote a simple job that takes a snapshots of v$session, v$sesstat on periodic interval. On a next day I check generated data and find couple of suspicious SQL for further investigation.
Most of them are used some of combination: PARALLEL hint, pipelined table functions, MATERIALIZE hint. Deeping into this further, I found that a incorrect statistics are due to PARALLEL hint.
I created a simple test case that was used to reproduce this issue.
SQL> sho parameter session_cached_cursors
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
session_cached_cursors integer 50
SQL>
SQL> select s.value
2 from v$statname n,
3 v$mystat s
4 where n.name = 'session cursor cache count'
5 and s.statistic#=n.statistic#;
VALUE
----------
49
SQL>
SQL> select /*+ parallel(4)*/count(distinct owner) from t;
COUNT(DISTINCTOWNER)
--------------------
59
SQL>
SQL> select s.value
2 from v$statname n,
3 v$mystat s
4 where n.name = 'session cursor cache count'
5 and s.statistic#=n.statistic#;
VALUE
----------
58
Notice that 'session cursor cache count' statistic is 49 before parallel query and 58 after.
After I executed parallel query multiple times and checked a statistics at each step, I found that each query execution leads to increase of 'session cursor cache count' statistics by 2*(parallel_degree).
SQL> select /*+ parallel(4)*/count(distinct owner) from t;
COUNT(DISTINCTOWNER)
--------------------
59
SQL>
SQL> select s.value
2 from v$statname n,
3 v$mystat s
4 where n.name = 'session cursor cache count'
5 and s.statistic#=n.statistic#;
VALUE
----------
98
SQL>
SQL> select /*+ parallel(8)*/count(distinct owner) from t;
COUNT(DISTINCTOWNER)
--------------------
59
SQL>
SQL> select s.value
2 from v$statname n,
3 v$mystat s
4 where n.name = 'session cursor cache count'
5 and s.statistic#=n.statistic#;
VALUE
----------
114
SQL>
Good news: issue is not reproduced in 12.1.0.2.
I hope that Oracle support resolve this issue in 11.2.0.4. Update 17.06.2015: Oracle has released the patch 21135007: SESSION CURSOR CACHE COUNT STATISTICS IS INCORRECT
I applied it to 11.2.0.4 environment and it works as expected.
Now the 'session cursor cache count' statistics is correct.