【文章內(nèi)容簡介】
ALTER SYSTEM SET SHARED_POOL_SIZE = 32M。系統(tǒng)已更改。但是所改變共享池的大小受限于SGA_MAX_SIZE參數(shù)。這個參數(shù)將在以后的章節(jié)中詳細(xì)地介紹。N 注意:在本書中采用如下的約定:l SQL為SQL*Plus的提示符。l 沒有陰影的內(nèi)容為要輸入的SQL語句或SQL*Plus命令等。如在例11中要輸入ALTER SYSTEM SET SHARED_POOL_SIZE = 32M。l 陰影中的內(nèi)容為系統(tǒng)顯示(輸出)的結(jié)果。如在例11中的“系統(tǒng)已更改?!?。U提示:即使把共享池設(shè)置得足夠大并且所使用的SQL或PL/SQL語句也是能共享的代碼,Oracle也并不能一定使用內(nèi)存(共享池)中的代碼。例如當(dāng)有用戶修改了某個對象的定義之后,所有使用這個對象的內(nèi)存(共享池)中的代碼全部被Oracle設(shè)置為無效,因此在使用時必須重新編譯。 數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)如果用戶發(fā)出了以下的SQL語句:SELECT * FROM emp,Oracle又是怎樣提取數(shù)據(jù)庫中的數(shù)據(jù)呢?服務(wù)器進(jìn)程將首先在數(shù)據(jù)庫高速緩沖區(qū)(database buffer cache)中搜尋所需的數(shù)據(jù),如果找到了就直接使用而不進(jìn)行磁盤操作,如果沒找到就將進(jìn)行磁盤操作把數(shù)據(jù)文件中的數(shù)據(jù)讀入到數(shù)據(jù)庫高速緩沖區(qū)中。從以上的討論可知,為了能夠共享數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫高速緩沖區(qū)要足夠的大,因為這樣那些可以共享的數(shù)據(jù)才不會被很快地淘汰出內(nèi)存。Oracle也是使用一個叫做LRU(least recently used)的隊列(list)或算法(algorithm)來實現(xiàn)對數(shù)據(jù)庫高速緩沖區(qū)的管理??梢允褂脜?shù)文件中的DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個參數(shù)來設(shè)置數(shù)據(jù)庫高速緩沖區(qū)的大小。其中DB_BLOCK_SIZE為Oracle數(shù)據(jù)塊(內(nèi)存緩沖區(qū))的大小,在Oracle數(shù)據(jù)庫中內(nèi)存和外存的數(shù)據(jù)塊的大小是相同的。DB_BLOCK_BUFFERS為內(nèi)存緩沖區(qū)的個數(shù)。數(shù)據(jù)庫高速緩沖區(qū)大小為這兩個參數(shù)的乘積。但是DB_BLOCK_SIZE的值是在創(chuàng)建數(shù)據(jù)庫時設(shè)定的,如果要改變該參數(shù)的值一般需要重建數(shù)據(jù)庫。因此多數(shù)情況下只能通過改變DB_BLOCK_BUFFERS的值來調(diào)整數(shù)據(jù)庫高速緩沖區(qū)大小。但一定得重新啟動Oracle數(shù)據(jù)庫。在Oracle 9i或以后的版本中,Oracle引入了另一個參數(shù)DB_CACHE_SIZE,這個參數(shù)是一個動態(tài)參數(shù),即可以在數(shù)據(jù)庫運(yùn)行時動態(tài)地改變該參數(shù)。可以使用類似于 例12的命令來改變數(shù)據(jù)庫高速緩沖區(qū)的大?。豪?2SQL ALTER SYSTEM SET DB_CACHE_SIZE = 48M。系統(tǒng)已更改。 內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)Oracle 9i或以后的版本還提供了一個稱為內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)的工具來幫助獲得調(diào)整數(shù)據(jù)庫高速緩沖區(qū)的統(tǒng)計信息。內(nèi)存緩沖區(qū)顧問一共有3種狀態(tài):(1)ON:該工具打開,為該工具分配內(nèi)存并進(jìn)行統(tǒng)計信息的收集。要有一定的內(nèi)存和CPU開銷。(2)READY:該工具關(guān)閉,為該工具分配內(nèi)存但不進(jìn)行統(tǒng)計信息的收集,因此沒有CPU的開銷。(3)OFF:該工具關(guān)閉,不為該工具分配內(nèi)存也不進(jìn)行統(tǒng)計信息的收集,因此既沒有內(nèi)存的開銷也沒有CPU開銷。可以通過修改初始化參數(shù)DB_CACHE_ADVICE的值來改變該工具的狀態(tài)。這一參數(shù)是一個動態(tài)參數(shù),因此可以使用ALTER SYSTEM命令來修改。例如可以利用類似于例13的SQL語句來查看它的狀態(tài):例13SQL select id, name, block_size, advice_status 2 from v$db_cache_advice。 ID NAME BLOCK_SIZE ADV 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON 3 DEFAULT 4096 ON … 已選擇20行。 此時,例13的顯示結(jié)果表明了內(nèi)存緩沖區(qū)顧問是在開啟狀態(tài)。U提示:顯示結(jié)果中的…表示省略了一些行的顯示。之后可以使用類似于例14的命令將內(nèi)存緩沖區(qū)顧問(v$db_cache_advice)工具關(guān)閉:例14SQL alter system set db_cache_advice = off。系統(tǒng)已更改。這時可以再使用類似于例15的SQL語句來查看它的狀態(tài):例15SQL select id, name, block_size, advice_status 2 from v$db_cache_advice。 ID NAME BLOCK_SIZE ADV 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF 3 DEFAULT 4096 OFF … 已選擇20行。 此時,例15的顯示結(jié)果表明已成功地關(guān)閉了內(nèi)存緩沖區(qū)顧問(詳細(xì)地介紹該工具的使用已超出了本書的范圍,有興趣的讀者可參閱Oracle 9i/10g調(diào)優(yōu)方面的書籍)。 重做日志緩沖區(qū)(redo log buffer)從理論上來講,如果數(shù)據(jù)庫不會崩潰,根本沒有必要引入重做日志緩沖區(qū)(redo log buffer)。引入重做日志緩沖區(qū)的主要目的(在Oracle 8i之前的版本中也是惟一的目的)就是數(shù)據(jù)的恢復(fù)。Oracle在使用任何DML或DDL操作改變數(shù)據(jù)之前都將恢復(fù)所需的信息,即在寫數(shù)據(jù)庫高速緩沖區(qū)之前,先寫入重做日志緩沖區(qū)。與執(zhí)行查詢語句有所不同,Oracle在執(zhí)行DML語句時只有編譯(parse)和執(zhí)行(execute)兩個階段。以下是Oracle執(zhí)行UPDATE語句的步驟:(1)如果數(shù)據(jù)和回滾數(shù)據(jù)不在數(shù)據(jù)庫高速緩沖區(qū)中,Oracle服務(wù)器進(jìn)程將把它們從數(shù)據(jù)文件中讀到數(shù)據(jù)庫高速緩沖區(qū)中。(2)Oracle服務(wù)器進(jìn)程在要修改的數(shù)據(jù)行上加鎖(行一級的鎖)。(3)Oracle服務(wù)器進(jìn)程將數(shù)據(jù)的變化信息和回滾所需的信息都記錄在重做日志緩沖 區(qū)中。(4)Oracle服務(wù)器進(jìn)程將回滾所需的原始值和對數(shù)據(jù)所做的修改都寫入數(shù)據(jù)庫高速 緩沖區(qū)(database buffer cache)。之后在數(shù)據(jù)庫高速緩沖區(qū)中所有的這些數(shù)據(jù)塊都將被標(biāo)為臟緩沖區(qū),因為此時內(nèi)外存的數(shù)據(jù)是不同的(不一致的)。Oracle處理INSERT或DELETE語句的步驟與處理UPDATE語句的步驟大體相同。N 注意:有關(guān)回滾數(shù)據(jù)在本書的后面章節(jié)中還要介紹,讀者也可以參閱筆者的另一本書《從實踐中學(xué)習(xí)Oracle/SQL》~259頁。 大池(large pool)和Java池(Java pool)除了以上所介紹的內(nèi)存結(jié)構(gòu)之外,SGA中還有可能包含large pool和Java pool兩個可選的內(nèi)存結(jié)構(gòu)。引入large pool的主