OracleLibraryCache的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Oracle Library Cache的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Oracle Library Cache的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、山陽(yáng)網(wǎng)絡(luò)推廣、小程序制作、山陽(yáng)網(wǎng)絡(luò)營(yíng)銷、山陽(yáng)企業(yè)策劃、山陽(yáng)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供山陽(yáng)建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

   Oracle Library Cache深入解析

   每一個(gè)進(jìn)入庫(kù)緩存的對(duì)象,在庫(kù)緩存中都被按照本身內(nèi)容分割成多塊進(jìn)行存貯。Oracle這樣做的目的是為了更靈活的內(nèi)存管理,因?yàn)樵趦?nèi)存尋找大塊連續(xù)的內(nèi)存,總比尋找小塊連續(xù)內(nèi)存更慢一些.如果一個(gè)庫(kù)緩存對(duì)象(如一條SQL語(yǔ)句的執(zhí)行計(jì)劃),它所占的內(nèi)存被切割成4個(gè)小塊,它們分別被存放在庫(kù)緩存的各處,并且互不相連。為了將這4個(gè)小塊組合起來(lái),Oracle另外這個(gè)庫(kù)緩存對(duì)象分配一小塊內(nèi)存,這塊內(nèi)存中存有其他4個(gè)小塊內(nèi)存的地址,并且,還有一些有關(guān)此庫(kù)緩存對(duì)象的基本信息,如名字、類型等等,這塊內(nèi)存就叫庫(kù)緩存對(duì)象句柄(handles)。

Library Cache結(jié)構(gòu)示意圖如下:

 Oracle Library Cache的示例分析

   在訪問(wèn)庫(kù)緩存對(duì)象時(shí),比如軟解析時(shí),要從庫(kù)緩存中讀取執(zhí)行計(jì)劃。Oracle首先找到句柄,讀取句柄中的信息,這就叫做一次庫(kù)緩存Get。如果庫(kù)緩存中不包括對(duì)象的句柄信息,Oracle就要重新在庫(kù)緩存中分配內(nèi)存、構(gòu)造句柄,這就是庫(kù)緩存句柄未命中(Get Miss)。相反,如果在庫(kù)緩存中找到了對(duì)象句柄,就是庫(kù)緩存句柄命中(Get Hit)。硬解析時(shí),就會(huì)發(fā)生Get Miss。而軟解析則是Get Hit。

  在取出句柄中的其他內(nèi)存塊地址后,每訪問(wèn)一個(gè)內(nèi)存塊,都叫做一次庫(kù)緩存Pin。如果相應(yīng)的內(nèi)存塊已經(jīng)不在內(nèi)存中了,這就是Pin Miss,Pin的未命中。相反就是Pin Hit。

  當(dāng)庫(kù)緩存中對(duì)象發(fā)生改變后,會(huì)引起其他一些對(duì)象的無(wú)效(Invalidation)。比如,你修改了一個(gè)表的結(jié)構(gòu),那么,選擇了這個(gè)表的SQL語(yǔ)句的執(zhí)行計(jì)劃就會(huì)變的無(wú)效。其實(shí)大部分對(duì)表的DDL操作,都會(huì)造成相關(guān)SQL語(yǔ)句執(zhí)行計(jì)劃的無(wú)效。就連Grant(授權(quán))、Revoke(撤消權(quán)限)這樣看來(lái)跟執(zhí)行計(jì)劃耗無(wú)關(guān)系的操作,都會(huì)引起無(wú)效。如果有一個(gè)表TAB1,你發(fā)布了“Grant 某權(quán)限 on tab1 to 某用戶”,或“revoke 某權(quán)限 on tabl from 某用戶”這樣的操作,那么,所有和TAB1表有關(guān)的執(zhí)行計(jì)劃都將無(wú)效。無(wú)效之后,庫(kù)緩存對(duì)象除句柄外的所有內(nèi)存塊,都將被清除。再使用到對(duì)象后,必須重新加載對(duì)象。如上例,如果你對(duì)TAB1使用了DDL語(yǔ)句,那么所有使用了TAB1表語(yǔ)句的執(zhí)行計(jì)劃都將無(wú)效,你再使用這些語(yǔ)句時(shí),就必須重新硬解析語(yǔ)句。

案例:

16:54:51 SCOTT@ prod>select * from dept1;     DEPTNO DNAME          LOC ---------- -------------- -------------         10 ACCOUNTING     NEW YORK         20 RESEARCH       DALLAS         30 SALES          CHICAGO         40 OPERATIONS     BOSTON Elapsed: 00:00:00.06 16:54:03 SYS@ prod> select NAMESPACE,GETS,PINS,RELOADS,INVALIDATIONS from v$librarycache NAMESPACE                            GETS       PINS    RELOADS INVALIDATIONS ------------------------------ ---------- ---------- ---------- ------------- SQL AREA                             7722      30134         30            97 TABLE/PROCEDURE                     10906       8328         88             0 BODY                                  608        801          0             0 TRIGGER                                24         41          0             0 INDEX                                  96         62          0             0 CLUSTER                               485        300          0             0 QUEUE                                  36        168          0             0 APP CONTEXT                            14         14          0             0 RULESET                                 3          3          0             0 SUBSCRIPTION                            5          5          0             0 EDITION                                58         99          0             0 DBLINK                                  5          0          0             0 OBJECT ID                              59          0          0             0 SCHEMA                               3584          0          0             0 DBINSTANCE                              1          0          0             0 15 rows selected. Elapsed: 00:00:00.01 在訪問(wèn)對(duì)象dept1上,做DDL操作,導(dǎo)致原來(lái)的執(zhí)行計(jì)劃變得無(wú)效 16:55:01 SCOTT@ prod>grant all on dept1 to hr; Grant succeeded. Elapsed: 00:00:00.26 16:55:24 SCOTT@ prod>select * from dept1;     DEPTNO DNAME          LOC ---------- -------------- -------------         10 ACCOUNTING     NEW YORK         20 RESEARCH       DALLAS         30 SALES          CHICAGO         40 OPERATIONS     BOSTON Elapsed: 00:00:00.04 16:55:29 SCOTT@ prod> 16:55:08 SYS@ prod>r   1* select NAMESPACE,GETS,PINS,RELOADS,INVALIDATIONS from v$librarycache NAMESPACE                            GETS       PINS    RELOADS INVALIDATIONS ------------------------------ ---------- ---------- ---------- ------------- SQL AREA                             7781      30422         32           100 TABLE/PROCEDURE                     10980       8420         88             0 BODY                                  623        817          0             0 TRIGGER                                26         43          0             0 INDEX                                  96         62          0             0 CLUSTER                               488        302          0             0 QUEUE                                  36        168          0             0 APP CONTEXT                            14         14          0             0 RULESET                                 3          3          0             0 SUBSCRIPTION                            5          5          0             0 EDITION                                59        101          0             0 DBLINK                                  5          0          0             0 OBJECT ID                              59          0          0             0 SCHEMA                               3595          0          0             0 DBINSTANCE                              1          0          0             0 15 rows selected. Elapsed: 00:00:00.03 16:55:34 SYS@ prod>

  因此,使用DDL語(yǔ)句是需要注意的,如果沒(méi)有要求立即使用DDL,我們最好等到數(shù)據(jù)庫(kù)并不繁忙的時(shí)刻,再執(zhí)行DDL。作為DBA,這一點(diǎn)一定要牢記,除非要求立即執(zhí)行,否則等到數(shù)據(jù)庫(kù)并不繁忙時(shí)再執(zhí)行任何DDL。

  再補(bǔ)充一點(diǎn),無(wú)效和庫(kù)緩存對(duì)象的老化并不一樣。老化是連句柄帶對(duì)象的所有內(nèi)存塊都被清除出去了。而無(wú)效是只在庫(kù)緩存中保留對(duì)象句柄,但所有其他內(nèi)存塊都被清除出去。對(duì)于無(wú)效的對(duì)象,當(dāng)再次重新調(diào)用到它時(shí),Oracle會(huì)再次將它調(diào)入到庫(kù)緩存中,這個(gè)操作被稱為Reload。一般說(shuō)來(lái),Reload與Get是無(wú)關(guān)的,因?yàn)镽eload是在對(duì)象無(wú)效后才發(fā)生的,而對(duì)象的無(wú)效并不影響對(duì)象句柄。好,說(shuō)了這么多,下面我們來(lái)看這些值的意義。

  我們已經(jīng)講述了Get、Pin與它們的命中、未命中,還有什么是Invalidation和Reload。在OLTP系統(tǒng)中,Get的命中率應(yīng)該在90%之上。而Reload和Pin的次數(shù)的比值,應(yīng)該小于1%。如果超出了這些數(shù)值范圍,就說(shuō)明庫(kù)緩存的使用有問(wèn)題。問(wèn)題的原因主要有兩個(gè),沒(méi)有使用綁定變量或是庫(kù)緩存太小。不過(guò)Reload和Pin的比例過(guò)高,也可能是在繁忙時(shí)執(zhí)行了DDL所導(dǎo)致的。

  另外,V$librarycache的第一列是NAMESPACE,也就是名稱空間。它相當(dāng)于存儲(chǔ)在庫(kù)緩存中對(duì)象的類型。具體的名稱空間是什么意思呢?就是對(duì)象的名字所在的范圍,比如表和列的名字就不在一個(gè)范圍內(nèi)。也就是說(shuō)表名和列名可以重復(fù),還有用戶名和表、列也不在同一范圍內(nèi),用戶名也可以和表、列名相同。我可以有個(gè)叫做AA的表,也可以有叫做AA的用戶。這兩個(gè)AA處在不同的范圍內(nèi),也就明它們的名稱空間不同。這就好像在北京有個(gè)電話號(hào)碼是12345678,在上海也有個(gè)12345678,這兩個(gè)電話號(hào)碼雖然相同,但不會(huì)引起問(wèn)題,因?yàn)樗鼈冊(cè)诓煌姆秶鷥?nèi)。這個(gè)范圍,也可以說(shuō)是類型。

我顯示一下V$librarycache的所有行(列只有一部分):

SQL> select * from v$librarycache; NAMESPACE             GETS    GETHITS GETHITRATIO       PINS   PINHITS --------------- ---------- --------------------- ---------- ---------- SQL AREA             21811       4149 .190225116     120258     105272 TABLE/PROCEDURE      25152     16372  .650922392      60649     46008 BODY                  4360       4098 .939908257       5931       5537 TRIGGER                320        251    .784375       1655       1576 INDEX                  453        128 .282560706       2065       1531 CLUSTER                755        728 .964238411       2339       2296 OBJECT                   0          0           1          0          0 PIPE                     0          0           1          0          0 JAVA SOURCE             0          0           1          0          0 JAVA RESOURCE            0          0           1          0          0 JAVA DATA                0          0           1          0          0

   可以看在庫(kù)緩存中共有11個(gè)名稱空間,我們基本上可以說(shuō)庫(kù)緩存中有11種類型的信息。有一個(gè)非常重要的指標(biāo),就是庫(kù)緩存命中率,這個(gè)命中率就是庫(kù)緩存中所有對(duì)象的GETHITRAIO,它的計(jì)算方法如下:

select 1-sum(gethits)/sum(gets) fromv$librarycache;

這個(gè)比率應(yīng)該在90%以上。

還有一個(gè)比率也很重要,就是Reload和Pin的比值,這個(gè)比值應(yīng)該小于1%。

如果沒(méi)有達(dá)到這些比例,解決方法很簡(jiǎn)單,問(wèn)題或者是SQL語(yǔ)句沒(méi)有共享,或者是共享池太小。

有關(guān)庫(kù)緩存命中率,也可以查看STATSPACK報(bào)告中的Library Hit %項(xiàng)。這個(gè)我們上面已經(jīng)說(shuō)過(guò)了。

Library cache lock、Library cache pin等待事件

  等待事件在Oracle中無(wú)處不在,為了記錄這些數(shù)據(jù),是損失了一些性能。但是你是想出了問(wèn)題一籌莫展好,還是可以利用等待事件或各種資料輕松的查找出問(wèn)題在哪好呢?而且,這些等待事件和資源你即使不去用它,Oracle一樣會(huì)消耗CPU去記載它們。因此,一個(gè)好的DBA一定要對(duì)各種等待事件、資料了如指掌。下面,我們介紹兩個(gè)和庫(kù)緩存相關(guān)的等待事件,如題,就是Library cache lock和Library cache pin。

  我們上面說(shuō)到庫(kù)緩存中的對(duì)象在庫(kù)緩存中被切割成多個(gè)內(nèi)存塊,另有一個(gè)對(duì)象句柄記錄了各個(gè)內(nèi)存塊的地址和其他的一些信息。當(dāng)你要修改句柄中的信息時(shí),需要在句柄上加獨(dú)占鎖,而如果另一個(gè)進(jìn)程恰好在這時(shí)要求讀、寫(xiě)句柄中的信息,它就必須等待。此時(shí)的等待就被Oracle記入Library cache lock事件。而讀、寫(xiě)對(duì)象內(nèi)存塊也是無(wú)法同時(shí)進(jìn)行的,有人如果正在寫(xiě),你的讀操作就必須等待,讀寫(xiě)內(nèi)存塊的等待事件就是Library cache pin。如果這兩個(gè)等待事件過(guò)多,同樣說(shuō)明了庫(kù)緩存過(guò)小或沒(méi)有共享執(zhí)行計(jì)劃。或者,當(dāng)你在數(shù)據(jù)庫(kù)繁忙時(shí)使用DDL時(shí),也會(huì)有這兩個(gè)等待事件。

案例1: 業(yè)務(wù)運(yùn)行前: 17:07:30 SYS@ prod>select name,GETS,MISSES  from v$latch where upper(name) like '%LIBRARY%'  OR upper(name) like '%SHARE%'; NAME                                                                   GETS     MISSES ---------------------------------------------------------------- ---------- ---------- test shared non-parent l0                                                 0          0 ksxp shared latch                                                         0          0 kcfis stats shared latch                                                  0          0 shared pool                                                          126676         61 library cache load lock                                                   0          0 shared pool simulator                                                  6576          0 shared pool sim alloc                                                    45          0 Shared B-Tree                                                           302          0 shared server configuration                                               6          0 shared server info                                                        1          0 運(yùn)行業(yè)務(wù): 17:08:34 SCOTT@ prod>begin 17:08:38   2  for i in 1..100000 loop 17:08:52   3  execute immediate 'insert into t1 values ('||i||')'; 17:09:18   4  end loop; 17:09:26   5  end; 17:09:27   6  / PL/SQL procedure successfully completed. 業(yè)務(wù)運(yùn)行后: 17:11:05 SYS@ prod>select name,GETS,MISSES  from v$latch where upper(name) like '%LIBRARY%'  OR upper(name) like '%SHARE%' NAME                                                                   GETS     MISSES ---------------------------------------------------------------- ---------- ---------- test shared non-parent l0                                                 0          0 ksxp shared latch                                                         0          0 kcfis stats shared latch                                                  0          0 shared pool                                                         4526672        214 library cache load lock                                                   0          0 shared pool simulator                                               1086437          0 shared pool sim alloc                                                  2048          0 Shared B-Tree                                                           316          0 shared server configuration                                               6          0 shared server info                                                        1          0 10 rows selected. 17:15:42 SYS@ prod>select sid,event,WAIT_TIME,state from v$session_wait where sid=42        SID EVENT                                                             WAIT_TIME STATE ---------- ---------------------------------------------------------------- ---------- -------------------         42 latch: shared pool                                                       -1 WAITED SHORT TIME Elapsed: 00:00:00.08 案例2: 業(yè)務(wù)運(yùn)行前: 17:18:35 SYS@ prod>select sid,EVENT,TOTAL_WAITS,AVERAGE_WAIT  from v$session_event where sid in (42,46);        SID EVENT                                                            TOTAL_WAITS AVERAGE_WAIT ---------- ---------------------------------------------------------------- ----------- ------------         42 Disk file operations I/O                                                   4          .03         42 log file switch (private strand flush incomplete)                          1        10.03         42 log file sync                                                              4         1.76         42 db file sequential read                                                  385          .23         42 latch: row cache objects                                                   5          .44         42 latch: shared pool                                                       194          .25         42 SQL*Net message to client                                                 24            0         42 SQL*Net message from client                                               23       5318.9         42 SQL*Net break/reset to client                                              2          .08         42 events in waitclass Other                                                  1            0         46 Disk file operations I/O                                                   1          .03         46 db file sequential read                                                   33          .02         46 SQL*Net message to client                                                 13            0         46 SQL*Net message from client                                               12         79.9 14 rows selected. 運(yùn)行業(yè)務(wù): 17:16:39 SYS@ prod>select sid ,username from v$session where username is not null;        SID USERNAME ---------- ------------------------------          1 SYS         42 SCOTT         46 HR          17:17:22 SCOTT@ prod>begin 17:20:46   2  for i in 1..100000 loop 17:20:52   3  execute immediate 'insert into t1 values ('||i||')'; 17:20:58   4  end loop; 17:21:02   5  end; 17:21:05   6  / PL/SQL procedure successfully completed. 17:17:42 HR@ prod>begin 17:21:16   2  for i in 1..100000 loop 17:21:24   3  execute immediate 'insert into scott.t1 values ('||i||')'; 17:21:49   4  end loop; 17:21:51   5  end; 17:21:52   6  / PL/SQL procedure successfully completed. 業(yè)務(wù)運(yùn)行后: 17:22:32 SYS@ prod>select sid,EVENT,TOTAL_WAITS,AVERAGE_WAIT  from v$session_event where sid in (42,46);        SID EVENT                                                            TOTAL_WAITS AVERAGE_WAIT ---------- ---------------------------------------------------------------- ----------- ------------         42 Disk file operations I/O                                                   4          .03         42 latch: cache buffers chains                                               16          .18         42 buffer busy waits                                                          2          .15         42 log file switch (private strand flush incomplete)                          1        10.03         42 log file sync                                                              4         1.76         42 db file sequential read                                                  413          .21         42 latch: row cache objects                                                  58          .13         42 latch: shared pool                                                      1008          .19         42 library cache: mutex X                                                   123          .33         42 SQL*Net message to client                                                 24            0         42 SQL*Net message from client                                               24      6044.43         42 SQL*Net break/reset to client                                              2          .08         42 events in waitclass Other                                                 87          .09         46 Disk file operations I/O                                                   3          .03         46 latch: cache buffers chains                                               13          .21         46 buffer busy waits                                                          1          .35         46 latch: redo copy                                                           1         1.26        SID EVENT                                                            TOTAL_WAITS AVERAGE_WAIT ---------- ---------------------------------------------------------------- ----------- ------------         46 db file sequential read                                                   38          .02         46 enq: HW - contention                                                       1          .01         46 latch: row cache objects                                                  58          .14         46 row cache lock                                                             1          .08         46 latch: shared pool                                                       666          .17         46 library cache: mutex X                                                    99          .29         46 SQL*Net message to client                                                 13            0         46 SQL*Net message from client                                               13      2010.63         46 events in waitclass Other                                                 68          .14 26 rows selected. Elapsed: 00:00:00.37 17:22:42 SYS@ prod> 17:22:02 SYS@ prod>select sid,event,WAIT_TIME,state from v$session_wait where sid=42 17:22:25   2   or sid=46;        SID EVENT                                                             WAIT_TIME STATE ---------- ---------------------------------------------------------------- ---------- -------------------         42 latch: shared pool                                                       -1 WAITED SHORT TIME         46 latch: shared pool                                                       -1 WAITED SHORT TIME

以上是“Oracle Library Cache的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享題目:OracleLibraryCache的示例分析-創(chuàng)新互聯(lián)
當(dāng)前URL:http://muchs.cn/article40/degcho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、網(wǎng)站改版網(wǎng)站策劃、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管