v$sql_shared_cursor檢視記錄多版本的資訊
What do the reasons given in v$SQL_SHARED_CURSOR mean
If
you are unable to use that script then you can select the same
information from the base views as illustrated in the examples below.
Lets use the example above and take a look at what SQL we can use to see this in the shared pool.
SCOTT runs select count(*) from emp
I can now run the following to see the PARENT statement and it's hash value and address
SQL_TEXT HASH_VALUE ADDRESS
------------------------ ------------ ----------------
select count(*) from emp 4085390015 0000000386BC2E58
To see the CHILDREN (I expect to see 1 at this point) :-
-
Version 9.2.X.X and below :
select * from v$sql_shared_cursor where kglhdpar = '0000000386BC2E58' -
Version 10.0.X.X and above:
select * from v$sql_shared_cursor where address = '0000000386BC2E58'
Output:
ADDRESS KGLHDPAR U S O O S L S E B P I S T A B D L T R I I R L I O S M U T N F ---------------- ---------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000000386BC2D08 0000000386BC2E58 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
We can see we have a single child (ADDRESS 0000000386BC2D08).
The
mismatch information (U S O O S L etc) is all N because this is the
first child. Now, if I log in as another user and run the same select
(select count(*) from emp) and look again I will get the following
output:-
ADDRESS KGLHDPAR U S O O S L S E B P I S T A B D L T R I I R L I O S M U T N F ---------------- ---------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0000000386BC2D08 0000000386BC2E58 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 0000000386A91AA0 0000000386BC2E58 N N N N N N N N N N N N N Y N N N Y N N N N N N N N N N N N N
We can now see the 2nd child ( 0000000386A91AA0) and also the reasons
why it could not be shared with the first (The 'Y's denote a mismatch).
The reasons are:
(1) AUTH_CHECK_MISMATCH and
(2) TRANSLATION_MISMATCH
This
is because the objects under my new user do not map to those of SCOTT
(the current child). A mismatch occurs because I cannot access SCOTTs
objects and translation fails since we have different object_ids for the
objects in each of our schemas.
What do the reasons given in v$SQL_SHARED_CURSOR mean?
Below are the list of reasons as well as some worked examples (Those denoted by ** are the ones most often seen) :-
-
UNBOUND_CURSOR
The existing child cursor was not fully built (in other words, it was not optimized) -
SQL_TYPE_MISMATCH
The SQL type does not match the existing child cursor
-
**OPTIMIZER_MISMATCH
The optimizer environment does not match the existing child cursor (The optimizer mode has changed and therefore the existing child cannot be re-used).
For example:
select count(*) from emp; ->> 1 PARENT, 1 CHILD
alter session set optimizer_mode=ALL_ROWS
select count(*) from emp; ->> 1 PARENT, 2 CHILDREN
Note: The behavior applies with the setting of trace events. for example, if I turned on tracing with 10046 than I would get an OPTIMIZER_MISMATCH and another child cursor -
OUTLINE_MISMATCH
The outlines do not match the existing child cursor. For example, if a user had created stored outlines previously for this command and they were stored in separate categories (say "OUTLINES1" and "OUTLINES2"), if they then executed the following:
alter session set use_stored_outlines = OUTLINES1;
select count(*) from emp;
alter session set use_stored_oulines= OUTLINES2;
select count(*) from emp;
The second execution of the select from emp would create another child since the outline used is different than the first run. This child would be marked as an OUTLINE_MISMATCH. -
STATS_ROW_MISMATCH
The existing statistics do not match the existing child cursor. Check that 10046/sql_trace is not set on all sessions as this can cause this. -
LITERAL_MISMATCH
Non-data literal values do not match the existing child cursor -
SEC_DEPTH_MISMATCH
Security level does not match the existing child cursor -
EXPLAIN_PLAN_CURSOR
The child cursor is an explain plan cursor and should not be shared. Explain plan statements will generate a new child by default - the mismatch will be this. -
BUFFERED_DML_MISMATCH
Buffered DML does not match the existing child cursor -
PDML_ENV_MISMATCH
PDML environment does not match the existing child cursor -
INST_DRTLD_MISMATCH
Insert direct load does not match the existing child cursor -
SLAVE_QC_MISMATCH
The existing child cursor is a slave cursor and the new one was issued by the coordinator (or, the existing child cursor was issued by the coordinator and the new one is a slave cursor). -
TYPECHECK_MISMATCH
The existing child cursor is not fully optimized -
AUTH_CHECK_MISMATCH
Authorization/translation check failed for the existing child cursor
The user does not have permission to access the object in any previous version of the cursor. A typical example would be where each user has it's own copy of a table -
**BIND_MISMATCH
The bind metadata does not match the existing child cursor. For example, in the following, the definition of the bind variable 'a' has changed between the 2 statements:
variable a varchar2(100);
select count(*) from emp where ename = :a ->> 1 PARENT, 1 CHILD
variable a varchar2(400);
select count(*) from emp where ename = :a ->> 1 PARENT, 2 CHILDREN -
DESCRIBE_MISMATCH
The type-check heap is not present during the describe for the child cursor -
LANGUAGE_MISMATCH
The language handle does not match the existing child cursor
-
TRANSLATION_MISMATCH
The base objects of the existing child cursor do not match.
The definition of the object does not match any current version. Usually this is indicative of the same issue as "AUTH_CHECK_MISMATCH" where the object is different. -
ROW_LEVEL_SEC_MISMATCH
The row level security policies do not match -
INSUFF_PRIVS
Insufficient privileges on objects referenced by the existing child cursor -
INSUFF_PRIVS_REM
Insufficient privileges on remote objects referenced by the existing child cursor -
REMOTE_TRANS_MISMATCH
The remote base objects of the existing child cursor do not match. For example:
USER1:
select count(*) from table@remote_dbUSER2:
select count(*) from table@remote_dbAlthough the SQL is identical, the dblink pointed to by remote_db may be a private dblink which resolves to a different object altogether -
LOGMINER_SESSION_MISMATCH
-
INCOMP_LTRL_MISMATCH
-
OVERLAP_TIME_MISMATCH
Error_on_overlap_time mismatch -
SQL_REDIRECT_MISMATCH
SQL redirection mismatch -
MV_QUERY_GEN_MISMATCH
Materialized view query generation -
USER_BIND_PEEK_MISMATCH
User bind peeking mismatch -
TYPCHK_DEP_MISMATCH
Cursor has type-check dependencies -
NO_TRIGGER_MISMATCH
No trigger mismatch -
FLASHBACK_CURSOR
No cursor sharing for flashback -
ANYDATA_TRANSFORMATION
Anydata transformation change -
INCOMPLETE_CURSOR
Incomplete cursor. When bind length is upgradeable (i.e. we found a child cursor that matches everything else except that the bind length is not long enough), we mark the old cursor is not usable and build a new one. This means the version can be ignored. -
TOP_LEVEL_RPI_CURSOR
Top level/rpi cursor. In a Parallel Query invocation this is expected behaviour (we purposely do not share) -
DIFFERENT_LONG_LENGTH
Different long length -
LOGICAL_STANDBY_APPLY
Logical standby apply mismatch -
DIFF_CALL_DURN
Different call duration -
BIND_UACS_DIFF
Bind uacs mismatch -
PLSQL_CMP_SWITCHS_DIFF
PL/SQL compiler switches mismatch -
CURSOR_PARTS_MISMATCH
Cursor "parts executed" mismatch -
STB_OBJECT_MISMATCH
STB object different (now exists). For explanation of STB_OBJECT_MISMATCH, please read following blog: https://blogs.oracle.com/optimizer/entry/my_cursor_wasn_t_shared -
ROW_SHIP_MISMATCH
Row shipping capability mismatch -
PQ_SLAVE_MISMATCH
PQ slave mismatch If you encounter this reason code and you are using parallel execution (PX), then check you really want to be using it. This mismatch can be caused by running lots of small SQL statements which do not really need PX. Also, if you are on versions prior to 11g you may be hitting -
TOP_LEVEL_DDL_MISMATCH
Top-level DDL cursor -
MULTI_PX_MISMATCH
Multi-px and slave-compiled cursor -
BIND_PEEKED_PQ_MISMATCH
Bind-peeked PQ cursor -
MV_REWRITE_MISMATCH
MV rewrite cursor -
ROLL_INVALID_MISMATCH
Rolling invalidation window exceeded. This is caused by the rolling invalidation capability in DBMS_STATS. The child cannot be shared as it's invalidation window is exceeded. See:
Document 557661.1 Rolling Cursor Invalidations with DBMS_STATS in Oracle10g -
OPTIMIZER_MODE_MISMATCH
Optimizer mode mismatch -
PX_MISMATCH
Parallel query execution mismatch. Refer to the following for known issues where this reason is shown:
Document 1629107.1 Common Bugs Associated with PX_MISMATCH -
MV_STALEOBJ_MISMATCH
Materialixed View stale object mismatch -
FLASHBACK_TABLE_MISMATCH
Flashback table mismatch -
LITREP_COMP_MISMATCH
Literal replacement compilation mismatch
New in 11g :
-
PLSQL_DEBUG
Debug mismatch Session has debugging parameter plsql_debug set to true
-
LOAD_OPTIMIZER_STATS
Load optimizer stats for cursor sharing
-
ACL_MISMATCH
Check ACL mismatch
-
FLASHBACK_ARCHIVE_MISMATCH
Flashback archive mismatch
-
LOCK_USER_SCHEMA_FAILED
Failed to lock user and schema
-
REMOTE_MAPPING_MISMATCH
Remote mapping mismatch
-
LOAD_RUNTIME_HEAP_FAILED
Runtime heap mismatch
-
HASH_MATCH_FAILED
Hash mismatch. Set to "Y" if sharing fails due to a hash mismatch, such as the case with mismatched histogram data or a range predicate marked as unsafe by literal replacement (See )
New in 11.2:
-
PURGED_CURSOR
Cursor marked for purging. The cursor has been marked for purging with dbms_shared_pool.purge
-
BIND_LENGTH_UPGRADEABLE
Bind length upgradeable and could not be shared because a bind variable size was smaller than the new value being inserted (marked as BIND_MISMATCH in earlier versions).
-
USE_FEEDBACK_STATS
Cardinality feedback. Cardinality feedback is being used and therefore a new plan could be formed for the current execution.
-
BIND_EQUIV_FAILURE
The bind value's selectivity does not match that used to optimize the existing child cursor. When adaptive cursor sharing is used and the cursor is bind aware, then if the selectivity is outside of the current ranges and a new plan is desirable then a new child is raised with this as the reason code for non-sharing of the previous plan. For an example, see Document 836256.1. After each execution in the example, run:select sql_id, address, child_address, child_number, BIND_EQUIV_FAILURE from v$sql_shared_cursor where sql_id='19sxt3v07nzm4';... once the cursor is marked as bind aware and a second plan is seen then the following will be the resultant output:SQL_ID ADDRESS CHILD_ADDRESS CHILD_NUMBER BAs can be seen, the new version is created due to BIND_EQUIV_FAILURE
------------- ---------------- ---------------- ------------ -
19sxt3v07nzm4 000000007A1C0DE0 000000007A1BF980 0 N
19sxt3v07nzm4 000000007A1C0DE0 000000007A10DDB0 1 Y
There is no longer ROW_LEVEL_SEC_MISMATCH in 11.2.
Version_rpt script:
The script version_rpt can also be run to produce a summary report of the v$sql_shared_cursor view with additional diagnostic information. The script can be found in:
Running the Script:
Generate reports for all cursors with more than 100 versions using SQL_ID (10g and up):
Generate reports for all cursors with more than 100 versions using HASH_VALUE:
Generate the report for cursor with sql_id cyzznbykb509s:
What further tracing is available.
In 10G it is possible to use CURSORTRACE to aid the investigation of why cursors are not being shared. This event should only be used under the guidance of support and the resultant trace file is undocumented. To get the trace for a particular SQL statement you first of all need to get the hash_value (See the above select from v$sqlarea). You then set the trace on using:-
(levels 578-580 can be used for high level tracing (577=level 1, 578=level 2, 580=level 3)
This will write a trace file to user_dump_dest each time we try to reuse the cursor.
To turn off tracing use:-
'immediate trace name cursortrace level 2147483648, address 1';
Please note: exists in 10.2 (fixed in 10.2.0.4) where cursor trace cannot fully be turned off and single line entries will still be made to the trace file as a result. The w/a is to restart the instance. How invasive this BUG is depends on the executions of the cursor (and the size of the resultant trace file additions)
In 11.2 there is also cursordump:
(please ensure system , not session, is used as the level meaning changes)
This dumps some additional information such as expanding on the parameters for 'optimizer_mismatch' issues.
In later versions of the RDBMS there are also enhancements which dump more information as to the actual reason a child cursor could not share (ie the parameter differences). This information can be found in the REASON column of v$sql_shared_cursor and is in XML format. See for example.
Are there any times when a high version count is expected even though BINDS are being used?
Consider the following where cursor_sharing=SIMILAR
select /* TEST */ * from emp where sal > 101;
select /* TEST */ * from emp where sal > 102;
select /* TEST */ * from emp where sal > 103;
select /* TEST */ * from emp where sal > 104;
SELECT sql_text,version_count,address
FROM V$SQLAREA
WHERE sql_text like 'select /* TEST */%';
SELECT * FROM V$SQL_SHARED_CURSOR WHERE kglhdpar = '&my_addr';
You will see several versions , each with no obvious reason for not being shared
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7199859/viewspace-2121615/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視weblogic版本資訊Web
- 檢視Linux系統版本資訊Linux
- Linux系統如何檢視版本資訊Linux
- Linux系統glibc庫版本資訊檢視Linux
- 教你如何用MongoDB檢視版本資訊詳解MongoDB
- 在Linux中,如何檢視當前系統的版本資訊?Linux
- IJCAI 2019 | 整合多類資訊,阿里文娛提出多檢視多標記演算法SIMMAI阿里演算法
- 怎樣清除v$archived_log檢視中的過期資訊Hive
- win10 檢視病毒掃描記錄方法 win10如何檢視掃描檢測記錄Win10
- 檢視Docker容器的資訊Docker
- win10系統如何開啟藍屏記錄檢視錯誤資訊Win10
- win10如何檢視版本_win10檢視版本的方法Win10
- 『現學現忘』Git基礎 — 24、Git中檢視歷史版本記錄Git
- Win10任務檢視怎麼刪除記錄 win10清除任務檢視記錄的教程Win10
- win10程式使用記錄怎麼檢視 win10程式執行記錄在哪檢視Win10
- SAP中如何檢視BOM的修改記錄呢?
- CUDA 版本檢視
- 檢視EBS版本
- 檢視python版本Python
- Python版本檢視Python
- Linux檢視歷史記錄小技巧Linux
- NAS中如何檢視日誌記錄?
- git log檢視提交歷史記錄Git
- Linux 安全資訊檢視Linux
- win10 怎麼檢視開關機記錄_win10如何檢視開關機記錄Win10
- win10檢視軟體使用記錄方法 win10怎麼檢視軟體使用記錄Win10
- win10系統如何開啟藍色畫面記錄檢視錯誤資訊Win10
- 記錄安裝 Laravel 專案遇到多版本 PHP 的坑LaravelPHP
- EtreCheckpro for mac(快速檢視硬體資訊) v6.4啟用版Mac
- Linux - 檢視系統的版本Linux
- 檢視JAR包的JDK版本JARJDK
- 騰訊視訊編譯優化記錄編譯優化
- 檢視IIS版本號
- 檢視Linux核心版本Linux
- 檢視 Linux 系統資訊Linux
- git檢視config配置資訊Git
- ExifTool for Macexif資訊檢視工具Mac
- Git檢視指定commit資訊GitMIT
- kafka 檢視佇列資訊Kafka佇列