|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 我們繼續把前面的問題展開一下. 其實我們可以從數據庫內部監控shared pool的空間碎片情況. 這涉及到一個內部視圖x$ksmsp X$KSMSP的名稱含義為: [K]ernal [S]torage [M]emory Management [S]GA Hea[P] 其中每一行都代表著shared pool中的一個chunk首先記錄一下測試環境: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production PL/SQL Release 9.2.0.3.0 - Production CORE 9.2.0.3.0 Production TNS for Linux: Version 9.2.0.3.0 - Production NLSRTL Version 9.2.0.3.0 - Production 我們看一下x$ksmsp的結構: SQL> desc x$ksmsp Name Null? Type ----------------------------------------- -------- ---------------------------- ADDR RAW(4) INDX NUMBER INST_ID NUMBER KSMCHIDX NUMBER KSMCHDUR NUMBER KSMCHCOM VARCHAR2(16) KSMCHPTR RAW(4) KSMCHSIZ NUMBER KSMCHCLS VARCHAR2(8) KSMCHTYP NUMBER KSMCHPAR RAW(4) 我們關注以下幾個字段: KSMCHCOM是注釋字段,每個內存塊被分配以后,注釋會添加在該字段中. x$ksmsp.ksmchsiz代表塊大小 x$ksmsp.ksmchcls列代表類型,主要有四類,說明如下: free Free chunks--不包含任何對象的chunk,可以不受限制的被分配. recr Recreatable chunks--包含可以被臨時移出內存的對象,在需要的時候,這個對象可以 被重新創建.例如,許多存儲共享sql代碼的內存都是可以重建的. freeabl Freeable chunks--包含session周期或調用的對象,隨后可以被釋放.這部分內存有時候 可以全部或部分提前釋放.但是注意,由于某些對象是中間過程產生的,這些對象不能 臨時被移出內存(因為不可重建). perm Permanent memory chunks--包含永久對象.通常不能獨立釋放. 我們可以通過查詢x$ksmsp視圖來考察shared pool中存在的內存片的數量不過注意:Oracle的某些版本(如:10.1.0.2)在某些平臺上(如:HP-UX PA-RISC 64-bit)查詢該視圖可能導致過度的CPU耗用,這是由于bug引起的. 我們看一下測試: 初始啟動數據庫,x$ksmsp中存在2259個chunk SQL> select count(*) from x$ksmsp; COUNT(*) ---------- 2259 執行查詢: SQL> select count(*) from dba_objects; COUNT(*) ---------- 10491 此時shared pool中的chunk數量增加 SQL> select count(*) from x$ksmsp; COUNT(*) ---------- 2358 [page_break]這就是由于shared pool中進行sql解析,請求空間,進而導致請求free空間,分配、分割從而產生了更多,更細碎的內存chunk 由此我們可以看出,如果數據庫系統中存在大量的硬解析,不停請求分配free的shred pool內存除了必須的shared pool latch等競爭外,還不可避免的會導致shared pool中產生更多的內存碎片(當然,在內存回收時,你可能看到chunk數量減少的情況)我們看以下測試: 首先重新啟動數據庫: SQL> startup force; ORACLE instance started. Total System Global Area 47256168 bytes Fixed Size 451176 bytes Variable Size 29360128 bytes Database Buffers 16777216 bytes Redo Buffers 667648 bytes Database mounted. Database opened. 創建一張臨時表用以保存之前x$ksmsp的狀態: SQL> CREATE GLOBAL TEMPORARY TABLE e$ksmsp ON COMMIT PRESERVE ROWS AS 2 SELECT a.ksmchcom, 3 SUM (a.CHUNK) CHUNK, 4 SUM (a.recr) recr, 5 SUM (a.freeabl) freeabl, 6 SUM (a.SUM) SUM 7 FROM (SELECT ksmchcom, COUNT (ksmchcom) CHUNK, 8 DECODE (ksmchcls, ’recr’, SUM (ksmchsiz), NULL) recr, 9 DECODE (ksmchcls, ’freeabl’, SUM (ksmchsiz), NULL) freeabl, 10 SUM (ksmchsiz) SUM 11 FROM x$ksmsp GROUP BY ksmchcom, ksmchcls) a 12 where 1 = 0 13 GROUP BY a.ksmchcom; Table created. 保存當前shared pool狀態: SQL> INSERT INTO E$KSMSP 2 SELECT a.ksmchcom, 3 SUM (a.CHUNK) CHUNK, 4 SUM (a.recr) recr, 5 SUM (a.freeabl) freeabl, 6 SUM (a.SUM) SUM 7 FROM (SELECT ksmchcom, COUNT (ksmchcom) CHUNK, 8 DECODE (ksmchcls, ’recr’, SUM (ksmchsiz), NULL) recr, 9 DECODE (ksmchcls, ’freeabl’, SUM (ksmchsiz), NULL) freeabl, 10 SUM (ksmchsiz) SUM 11 FROM x$ksmsp 12 GROUP BY ksmchcom, ksmchcls) a 13 GROUP BY a.ksmchcom 14 / 41 rows created. 執行查詢: SQL> select count(*) from dba_objects; COUNT(*) ---------- 10492 比較前后shared pool內存分配的變化: SQL> select a.ksmchcom,a.chunk,a.sum,b.chunk,b.sum,(a.chunk - b.chunk) c_diff,(a.sum -b.sum) s_diff 2 from 3 (SELECT a.ksmchcom, 4 SUM (a.CHUNK) CHUNK, 5 SUM (a.recr) recr, 6 SUM (a.freeabl) freeabl, 7 SUM (a.SUM) SUM 8 FROM (SELECT ksmchcom, COUNT (ksmchcom) CHUNK, 9 DECODE (ksmchcls, ’recr’, SUM (ksmchsiz), NULL) recr, 10 DECODE (ksmchcls, ’freeabl’, SUM (ksmchsiz), NULL) freeabl, 11 SUM (ksmchsiz) SUM 12 FROM x$ksmsp 13 GROUP BY ksmchcom, ksmchcls) a 14 GROUP BY a.ksmchcom) a,e$ksmsp b 15 where a.ksmchcom = b.ksmchcom and (a.chunk - b.chunk) <>0 16 / KSMCHCOM CHUNK SUM CHUNK SUM C_DIFF S_DIFF ---------------- ---------- ---------- ---------- ---------- ---------- KGL handles 313 102080 302 98416 11 3664 KGLS heap 274 365752 270 360424 4 5328 KQR PO 389 198548 377 192580 12 5968 free memory 93 2292076 90 2381304 3 -89228 library cache 1005 398284 965 381416 40 16868 sql area 287 547452 269 490052 18 57400 6 rows selected. 我們簡單分析一下以上結果: 首先free memory的大小減少了89228(增加到另外五個組件中),這說明sql解析存儲占用了一定的內存空間 而chunk從90增加為93,這說明內存碎片增加了. 在下面的部分中,我會著手介紹一下KGL handles, KGLS heap這兩個非常重要的shared pool中的內存結構. 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!