oracle父游标和子游标,诊断Oracle high version count(高版本游标)问题
什么是high version cursor(高版本游標)?對于一個特定的游標有多少個版本就屬于高版本游標是沒有明確定義的.對于不同的系統有不同
什么是high version cursor(高版本游標)?
對于一個特定的游標有多少個版本就屬于高版本游標是沒有明確定義的.對于不同的系統有不同的數量界定.然而在awr報告中對于一個父游標超過20個子游標個數時就會被報告出來
然而當一個游標的版本數據達到成百上千,那么這些絕對是高版本游標.所以要檢查這些sql有高版本的原因要盡量使用這些sql能夠被共享.
什么是共享sql?
首先要記住的是所有sql語句都是式共享的.當一個sql語句被輸入時,Oracle將會對一個語句的文本創建一個hash value,oracle將使用這個hash value很容易地在共享池中查找是否已經存在有相同hash value的sql存在.
例如:select count*) from emp語句有一個hash value為 4085390015
那么oracle就會對這個sql語句創建一個父游標和一個子游標.如果一個sql語句永遠也不會被共享也沒關系-當它第一次被解析時會創建一個父游標和一個子游標.可以簡單地認為這個父游標代表這個hash value,子游標代表sql的元數據.
--------------------------------------分割線 --------------------------------------
Oracle PL/SQL基礎 游標
Oracle數據庫中游標的使用
PL/SQL中三種游標循環效率對比
Oracle高級顯式游標的使用
在CentOS 6.4下安裝Oracle 11gR2(x64)
Oracle 11gR2 在VMWare虛擬機中安裝步驟
Debian 下 安裝 Oracle 11g XE R2
--------------------------------------分割線 --------------------------------------
什么是元數據?
元數據是能讓sql語句運行的所有信息.例如,在上面的例子中給定的emp表屬于scott用戶,因此它有一個object_id來指示這個emp表.當scott用戶登錄時,對于運行這個語句的會話優化器參數會被初始化,所以優化器的使用也屬于元數據.
當scott用戶重新登錄后運行相同的命令(相同的sql語句),這時在共享池中已經存在相同的sql,(但是我們是不知道的),將對這個sql生成hash value并且在共享池搜索這個hash value.如果找到這個hash value,就會通過子游標來進行搜索來判斷是否存在子游標可以被重用(元數據相同).如果是那么就可以共享這個sql語句.
現在在共享池中這個sql語句只有一個子游標,因為元數據相同能讓我們使用已經存在的子游標來共享sql語句.父游標不是判斷能不能共享的基礎子游標才能決定是否共享.
現在如果另一個用戶test也有一個emp表.如果這個用戶也運行上面的查詢語句將會發生什么:
1. 會對這個語句創建一個hash value.它的hash value為4085390015
2. 這個sql在共享池中被找到
3. 搜索子游標(在這時已經有一個子游標了)
4. 因為test用戶的emp表的object_id與scott用戶的emp表的object_id是不同的所以會有一個’mismatch’
(本質上這里會依次搜索子游標鏈表,使用所有的子游標與當前sql的元數據進行比較.如果已經搜索了100個子游標直到找到一個可以共享的子游標為止.如果沒有找到可以共享的子游標那么就會重新創建一個子游標
5. 因此創建一個新的子游標所以現在有1個父游標和2個子游標.
為什么要關注high version cursor(高版本游標)
可以共享但沒有被共享的sql和合成版本的sql是造成library cache競爭的主要原因.競爭會降低數據庫的性能.在極端情況下會使用數據庫hang住.當一個游標有太多個不必要的版本時,每次游標被執行時,這個解析引擎為了找到你所想要的游標不得不搜索整個游標鏈表.這是非常消耗CPU資源的.
怎樣查看high version cursor(高版本游標)以及為何不能被共享
一種最簡單查看high version cursor(高版本游標)的方法是使用腳本High SQL Version Counts - Script to determine reason(s) (文檔 ID 438755.1)
現在這個腳本的版本為 version_rpt3_23.sql
下載這個腳本后需要進行安裝
SQ>conn / as sysdba
SQL>@F:\ version_rpt3_23.sql
使用方法如下:
對于10g及以后的版本來收集version超過100的所有游標
SQL> set pages 2000 lines 100
SQL>
SQL> SELECT b.*
2 FROM v$sqlarea a ,
3 TABLE(version_rpt(a.sql_id)) b
4 WHERE loaded_versions >=100;
COLUMN_VALUE
---------------------------------------------------------------------
根據hash value來收集version超過100的所有游標
SQL> set pages 2000 lines 100
SQL> SELECT b.*
2 FROM v$sqlarea a ,
3 TABLE(version_rpt(NULL,a.hash_value)) b
4 WHERE loaded_versions>=100;
COLUMN_VALUE
---------------------------------------------------------------------
使用sql_id來收集游標報告
SQL> set pages 2000 lines 100
SQL> SELECT * FROM TABLE(version_rpt('g7vpupcuqd9zz'));
COLUMN_VALUE
--------------------------------------------------------------------------------
Note:438755.1 Version Count Report Version 3.2.3 -- Today's Date 22-4月 -14 15:44
RDBMS Version :10.2.0.4.0 Host: IBMP740-1 Instance 1 : RLZY
==================================================================
Addr: 070000066F6659E8 Hash_Value: 895920127 SQL_ID g7vpupcuqd9zz
Sharable_Mem: 135775 bytes Parses: 110924 Execs:621954
Stmt:
0 insert into mt_fee( hospital_id,serial_no,serial_fee,stat_type,f
1 ee_batch,medi_item_type,item_code,item_name,his_item_code,his_it
2 em_name,serial_apply,fee_date,model,factory,standard,unit,price,
3 dosage,money,reduce_money,usage_flag,usage_days,opp_serial_fee,i
4 nput_staff,input_man,input_date,calc_flag,frozen_flag,frozen_ser
5 ial_fee,trans_date,recipe_no,hos_serial,doctor_no,doctor_name,au
6 dit_flag,trans_flag,defray_type ) values ( :1,:2,:3,:4,:5,:6,:7,
7 :8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:2
8 4,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37)
9
Versions Summary
----------------
AUTH_CHECK_MISMATCH :1
BIND_MISMATCH :13
TRANSLATION_MISMATCH :1
ROLL_INVALID_MISMATCH :3
Total Versions:12
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cursor_sharing = exact
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plan Hash Value Summary
-----------------------
Plan Hash Value Count
=============== =====
0 8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for AUTH_CHECK_MISMATCH :
# of Ver PARSING_USER_ID PARSING_SCHEMA_ID PARSING_SCHEMA_NAME
========== =============== ================= ===================
8 211 211 INSUR_CHANGDE
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for BIND_MISMATCH :
Consolidated details for BIND* columns:
BIND_MISMATCH,USER_BIND_PEEK_MISMATCH,BIND_UACS_DIFF,BIND_LENGTH_UPGRADEABLE,etc
BIND_EQUIV_FAILURE (Mislabled as ROW_LEVEL_SEC_MISMATCH BY bug 6964441 in 11gR1)
from v$sql_bind_capture
COUNT(*) POSITION MIN(MAX_LENGTH) MAX(MAX_LENGTH) DATATYPE BIND GRADUATION (PREC
======== ======== =============== =============== ======== =============== =====
13 1 32 32 1 No (,)
13 2 32 32 1 No (,)
13 3 32 32 1 No (,)
13 4 32 32 1 No (,)
13 5 32 32 1 No (,)
13 6 32 32 1 No (,)
13 7 32 32 1 No (,)
13 8 32 128 1 Yes (,)
13 9 32 128 1 Yes (,)
13 10 32 128 1 Yes (,)
13 11 32 32 1 No (,)
13 12 11 11 180 No (,)
13 13 32 32 1 No (,)
13 14 32 128 1 Yes (,)
13 15 32 128 1 Yes (,)
13 16 32 128 1 Yes (,)
9 17 32 128 1 Yes (,)
4 17 22 22 2 No (,)
13 18 32 128 1 Yes (,)
13 19 32 32 1 No (,)
13 20 32 32 1 No (,)
13 21 32 32 1 No (,)
13 22 32 32 1 No (,)
13 23 32 32 1 No (,)
13 24 32 32 1 No (,)
13 25 32 32 1 No (,)
13 26 11 11 180 No (,)
13 27 32 32 1 No (,)
13 28 32 32 1 No (,)
13 29 32 32 1 No (,)
13 30 7 7 12 No (,)
13 31 32 32 1 No (,)
13 32 32 128 1 Yes (,)
13 33 32 32 1 No (,)
13 34 32 32 1 No (,)
13 35 32 32 1 No (,)
13 36 32 32 1 No (,)
13 37 32 32 1 No (,)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for TRANSLATION_MISMATCH :
No objects in the plans with same name and different owner were found.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for ROLL_INVALID_MISMATCH :
No details available
####
To further debug Ask Oracle Support for the appropiate level LLL.
alter session set events
'immediate trace name cursortrace address 895920127, level LLL';
To turn it off do use address 1, level 2147483648
================================================================
如果不能使用這個腳本可以使用下面的方法從基本視圖中來查詢相同的信息
下面使用scott用戶來運行select count(*) from emp 語句,并運行下面的查詢來查看這個語句的父游標和它的hash value和address
SQL>select sql_text, hash_value,address from v$sqlarea where sql_text like 'select count(*) from emp%';
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!
總結
以上是生活随笔為你收集整理的oracle父游标和子游标,诊断Oracle high version count(高版本游标)问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php任意文件删除漏洞,phpshe后台
- 下一篇: oracle报V27的错误解决办法,or