oracle session_wait,转载:学习Oracle动态性能表-(8)-V$SESSION_WAIT,V$SESSION_EVENT
(1)-V$SESSION_WAIT
這是一個(gè)尋找性能瓶頸的關(guān)鍵視圖。它提供了任何情況下session在數(shù)據(jù)庫中當(dāng)前正在等待什么(如果session當(dāng)前什么也沒在做,則顯示它最后的等待事件)。當(dāng)系統(tǒng)存在性能問題時(shí),本視圖可以做為一個(gè)起點(diǎn)指明探尋問題的方向。
V$SESSION_WAIT中,每一個(gè)連接到實(shí)例的session都對應(yīng)一條記錄。
V$SESSION_WAIT中的常用列
lSID: session標(biāo)識(shí)
lEVENT: session當(dāng)前等待的事件,或者最后一次等待事件。
lWAIT_TIME: session等待事件的時(shí)間(單位,百分之一秒)如果本列為0,說明session當(dāng)前session還未有任何等待。
lSEQ#: session等待事件將觸發(fā)其值自增長
lP1, P2, P3: 等待事件中等待的詳細(xì)資料
lP1TEXT, P2TEXT, P3TEXT: 解釋說明p1,p2,p3事件
附注:
1.State字段有四種含義﹕
(1)Waiting:SESSION正等待這個(gè)事件。
(2)Waited unknown time:由于設(shè)置了timed_statistics值為false,導(dǎo)致不能得到時(shí)間信息。表示發(fā)生了等待,但時(shí)間很短。
(3)Wait short time:表示發(fā)生了等待,但由于時(shí)間非常短不超過一個(gè)時(shí)間單位,所以沒有記錄。
(4)Waited knnow time:如果session等待然后得到了所需資源,那么將從waiting進(jìn)入本狀態(tài)。
2.Wait_time值也有四種含義:
(1)值>0:最后一次等待時(shí)間(單位:10ms),當(dāng)前未在等待狀態(tài)。
(2)值=0:session正在等待當(dāng)前的事件。
(3)值=-1:最后一次等待時(shí)間小于1個(gè)統(tǒng)計(jì)單位,當(dāng)前未在等待狀態(tài)。
(4)值=-2:時(shí)間統(tǒng)計(jì)狀態(tài)未置為可用,當(dāng)前未在等待狀態(tài)。
3.Wait_time和Second_in_wait字段值與state相關(guān):
(1)如果state值為Waiting,那么wait_time值無用。Second_in_wait值是實(shí)際的等待時(shí)間(單位:秒)。
(2)如果state值為Wait unknow time,那么wait_time值和Second_in_wait值都無用。
(3)如果state值為Wait short time,那么wait_time值和Second_in_wait值都無用。
(4)如果state值為Waiting known time,那么wait_time值就是實(shí)際等待時(shí)間(單位:秒),Second_in_wait值無用。
V$SESSION_WAIT中的連接列
Column??????? View?????? ?????? ?????? Joined Column(s)
SID?????? ?????? V$SESSION?? ?????? SID
示例:
1.列出當(dāng)前系統(tǒng)的等待事件
SELECTevent,
sum(decode(wait_time,0,1,0)) "Curr",
sum(decode(wait_time,0,0,1)) "Prev",
count(*)"Total"
FROMv$session_waitGROUPBYeventORDERBYcount(*);
EVENT?? ?????? ?????? ?????? ?????? ?????? ?????? Prev?????? Curr?????? Tot
---------------------------------------------?????? ----??????? -----?????? -----
PL/SQL lock timer??????? ?????? ?????? ?????? 0???? ?????? 1???? ?????? 1
SQL*Net more data from client??? ?????? 0???? ?????? 1???? ?????? 1
smon timer???? ?????? ?????? ?????? ?????? ?????? 0???? ?????? 1???? ?????? 1
pmon timer???? ?????? ?????? ?????? ?????? ?????? 0???? ?????? 1???? ?????? 1
SQL*Net message to client??? ?????? ?????? 2???? ?????? 0???? ?????? 2
db file scattered read????? ?????? ?????? ?????? 2???? ?????? 0???? ?????? 2
rdbms ipc message?????? ?????? ?????? ?????? 0???? ?????? 7???? ?????? 7
Enqueue??????? ?????? ?????? ?????? ?????? ?????? 0???? ?????? 12??? ?????? 12
pipe get?? ?????? ?????? ?????? ?????? ?????? ?????? 0???? ?????? 12??? ?????? 12
db file sequential read???? ?????? ?????? ?????? 3???? ?????? 10??? ?????? 13
latch free?????? ?????? ?????? ?????? ?????? ?????? 9???? ?????? 6???? ?????? 15
SQL*Net message from client????? ?????? 835??????? 1380?????? 2215
這個(gè)按事件和wait_time的分組查詢列出下列的信息:
l多數(shù)的session都是空閑事件如:SQL*Net message from client, pipe get, PMON timer等。
lsession的cpu占用可以通過上次session的非等待事件大致算出,除此問題外:看起來多數(shù)session沒有在等待什么事情(難道他們都在干活?)但其最后等待事件都是SQL*Net message from client。
2.列出指定ID的等待事件
select*fromv$session_waitwheresid=100;
3.應(yīng)用p1,p2,p3進(jìn)行等待事件的分析
v$session_wait視圖的列代表的緩沖區(qū)忙等待事件如下:
P1—與等待相關(guān)的數(shù)據(jù)文件的全部文件數(shù)量。
P2—P1中的數(shù)據(jù)文件的塊數(shù)量。
P3—描述等待產(chǎn)生原因的代碼。
例:selectp1 "File #", p2 "Block #", p3 "Reason Code"
fromv$session_wait
whereevent ='buffer busy waits';
如果以上查詢的結(jié)果顯示一個(gè)塊在忙等待,以下的查詢將顯示這一塊的名稱和類型:
selectowner, segment_name, segment_type
fromdba_extents
wherefile_id = &P1and&P2betweenblock_idandblock_id + blocks -1;
我們也可以查詢dba_data_files以確定等待的文件的file_name,方法是使用v$session_wait中的P1。
從v$session_wait中查詢P3(原因編碼)的值可以知道session等待的原因。原因編碼的范圍從0到300,下列為部分編碼所代表的事項(xiàng):
0 塊被讀入緩沖區(qū)。
100 我們想要NEW(創(chuàng)建)一個(gè)塊,但這一塊當(dāng)前被另一session讀入。
110 我們想將當(dāng)前塊設(shè)為共享,但這一塊被另一session讀入,所以我們必須等待read()結(jié)束。
120 我們想獲得當(dāng)前的塊,但其他人已經(jīng)將這一塊讀入緩沖區(qū),所以我們只能等待他人的讀入結(jié)束。
130 塊被另一session讀入,而且沒有找到其它協(xié)調(diào)的塊,所以我們必須等待讀的結(jié)束。緩沖區(qū)死鎖后這種情況也有可能產(chǎn)生。所以必須讀入塊的CR。
200 我們想新創(chuàng)建一個(gè)block,但其他人在使用,所以我們只好等待他人使用結(jié)束。
210 Session想讀入SCUR或XCUR中的塊,如果塊交換或者session處于非連續(xù)的TX模式,所以等待可能需要很長的時(shí)間。
220 在緩沖區(qū)查詢一個(gè)塊的當(dāng)前版本,但有人以不合法的模式使用這一塊,所以我們只能等待。
230 以CR/CRX方式獲得一個(gè)塊,但塊中的更改開始并且沒有結(jié)束。
231 CR/CRX掃描找到當(dāng)前塊,但塊中的更改開始并且沒有結(jié)束。
(2)-V$SESSION_EVENT
本視圖記錄了每個(gè)session的每一項(xiàng)等待事件。由上文所知V$SESSION_WAIT顯示了session的當(dāng)前等待事件,而V$SESSION_EVENT則記錄了session自啟動(dòng)起所有的事件。
V$SESSION_EVENT中的常用列
lSID:session標(biāo)識(shí)
lEVENT:session等待的事件
lTOTAL_WAITS:此session當(dāng)前事件的總等待數(shù)
lTIME_WAITED:此session總等待時(shí)間(單位,百分之一秒)
lAVERAGE_WAIT:此session當(dāng)前事件平均等待時(shí)間(單位,百分之一秒)
lTOTAL_TIMEOUTS:等待超時(shí)次數(shù)
其它用法與V$SESSION_WAIT相似,不詳述了
附注:
Oracle的等待事件是衡量Oracle運(yùn)行狀況的重要依據(jù)及指標(biāo)。等待事件的概念是在Oracle7.0.1.2中引入的,大致有100個(gè)等待事件。在Oracle 8.0中這個(gè)數(shù)目增加到了大約150個(gè),在Oracle8i中大約有200個(gè)事件,在Oracle9i中大約有360個(gè)等待事件。主要有兩種類別的等待事件,即空閑(idle)等待事件和非空閑(non-idle)等待事件。
關(guān)于空閑事件和非空閑事件目前通過google可以搜索到非常多詳盡的相關(guān)信息,同時(shí)
Oracle Database Performance Tuning Guide and Reference中關(guān)于Wait Events也有非常詳盡的描述,在此就不多費(fèi)口舌了。不過我在itpub論壇看到有熱心人整理的chm格式非空閑事件說明,有興趣的朋友可以下載,鏈接如下:
非空閑事件說明
詳見:http://www.itpub.net/728733.html
總結(jié)
以上是生活随笔為你收集整理的oracle session_wait,转载:学习Oracle动态性能表-(8)-V$SESSION_WAIT,V$SESSION_EVENT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机窗口预览图,window_Win7
- 下一篇: 中希尔排序例题代码_超全面分析十大排序算