Every query needs to be parsed before it got executed. If some queries are quite frequently used, a good design will be reuse the parsed query. That means, it will not parse the same query again (provided that we are using bind variables), rather will reuse the existing parsed query and then execute it. In an ideal world, execute should be more than the parse. More parsing requires more CPU.
Ideally when execute is more than parse, the figure will be positive. The ratio goes down if there are more parses than the execute. Then some of the queries are parsed, but less or never executed!.
Causes could be one of the followings:
- There might be no “Prepared Statement caching” in java layer or in jdbc connection pool.
Enable Statement Caching in Java:
// Enable statement caching ((OracleConnection)connection).setStatementCacheSize(x); ((OracleConnection)connection).setImplicitCachingEnabled(true);
- There might be the case, before the execution of a query, the cursor was closed.
- There might not be enough “session cached cursors” to hold the queries to reuse.
Fallback if you cannot change the application(java) to use statement caching :
session_cached_cursors = X
- There might be the case where new queries were coming to play quite frequently.
- There might be connection interruptions, this need to be investigate from network end.
Below SQL query will help to identify, the SQL’s which is parsed but not executed or less executed:
set linesize 200; set pagesize 1000; col sql_text format a40; SELECT sq.sql_text, st.executions_total, st.parse_calls_total , round( 100*(1-( st.parse_calls_total / st.executions_total )),2) execute_to_parse , st.executions_delta, st.parse_calls_delta , round( 100*(1-( st.parse_calls_delta / st.executions_delta )),2) delta_ratio FROM DBA_HIST_SQLSTAT st , DBA_HIST_SQLTEXT sq , DBA_HIST_SNAPSHOT s WHERE s.snap_id = st.snap_id AND s.begin_interval_time >= to_date('2018-10-19 01:00 pm','YYYY-MM-DD HH:MI pm') AND s.end_interval_time <= to_date('2018-10-19 03:00 pm','YYYY-MM-DD HH:MI pm') AND st.sql_id = sq.sql_id AND st.parsing_schema_name='<schema_owner>' AND st.executions_total !=0 AND st.executions_delta !=0 ORDER BY delta_ratio;