oracle內(nèi)存架構(gòu)(三)

共享池

站在用戶的角度思考問題,與客戶深入溝通,找到通山網(wǎng)站設(shè)計(jì)與通山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋通山地區(qū)。

共享池緩存各種類型的程序數(shù)據(jù)。

例如,共享池存儲解析SQL、PL/SQL代碼、系統(tǒng)參數(shù)和數(shù)據(jù)字典信息。共享池涉及到數(shù)據(jù)庫中發(fā)生的幾乎所有的操作。例如,如果用戶執(zhí)行SQL語句,則oracle數(shù)據(jù)庫訪問共享池。

共享池分為幾個(gè)組件,其中最重要的部分如下圖所示:

oracle內(nèi)存架構(gòu)(三)

這些結(jié)構(gòu)包括:

·庫緩存

·數(shù)據(jù)字典緩存

·服務(wù)器結(jié)果緩存

·保留池

庫緩存詳解

庫緩存是存儲可執(zhí)行SQL和PL/SQL代碼的共享池內(nèi)存結(jié)構(gòu)。

該緩存包含共享的SQL和PL/SQL區(qū)和控制結(jié)構(gòu),如鎖和庫緩存句柄。在共享服務(wù)器架構(gòu)中,庫緩存還包含私有的SQL區(qū)域。

當(dāng)執(zhí)行SQL語句時(shí),數(shù)據(jù)庫嘗試重用以前執(zhí)行的代碼。如果一個(gè)SQL語句的解析存在于庫緩存并且可以被共享,那么數(shù)據(jù)庫就會重用該代碼,稱為軟解析或庫緩存命中(cache hit)。否則,數(shù)據(jù)庫必須構(gòu)建應(yīng)用程序的新的可執(zhí)行版本,稱為硬解析或緩存遺漏(cache miss)。

共享SQL區(qū)

數(shù)據(jù)庫會處理每個(gè)運(yùn)行在共享SQL區(qū)和私有SQL區(qū)的SQL語句。

數(shù)據(jù)庫在共享SQL區(qū)處理第一次出現(xiàn)的SQL語句,該區(qū)域可被所有用戶訪問,并且包含語句解析樹和執(zhí)行計(jì)劃。對于每一個(gè)唯一的SQL語句,只存在一個(gè)共享的SQL區(qū)。每個(gè)會話發(fā)出一個(gè)SQL語句都會在PGA中產(chǎn)生一個(gè)私有SQL區(qū)與之對應(yīng),即便是不同會話提交相同的SQL語句,但是每個(gè)會話都會有屬于自己的SQL區(qū)。PGA中每個(gè)私有的SQL區(qū)都會與共享SQL區(qū)相關(guān)聯(lián)。

當(dāng)應(yīng)用程序提交類似的SQL語句時(shí),數(shù)據(jù)庫將自動確定。數(shù)據(jù)庫同時(shí)考慮由用戶和應(yīng)用程序直接發(fā)出的SQL語句,以及語句在內(nèi)部發(fā)出的遞歸SQL語句。

數(shù)據(jù)庫執(zhí)行以下步驟:

1、檢查共享池,查看在共享SQL區(qū)域是否存在語法語義相似的語句

    ·如果存在相同的語句,那么數(shù)據(jù)庫將會直接使用它們,從而減少內(nèi)存消耗。

    ·如果不存在相同的語句,那么數(shù)據(jù)庫將會在共享池中分配一個(gè)新的共享SQL區(qū)。具有相同語法       但不同語意的語句使用子游標(biāo)。

在這兩種情況中,用戶的私有SQL區(qū)域指向包含語句和執(zhí)行計(jì)劃的共享SQL區(qū)域。

2、為會話分配一個(gè)私有的SQL區(qū)域

私有SQL區(qū)域的位置取決于會話建立的連接方式。如果會話是通過共享服務(wù)器連接,那么私有SQL區(qū)域的一部分將會保留在SGA中。

下圖顯示了一個(gè)專用的服務(wù)器架構(gòu),其中兩個(gè)會話在它們自己的PGA中保留同一SQL語句的副本。在共享服務(wù)器中,此副本位于UGA,它位于大池中,當(dāng)大池不存在時(shí)副本則會存在于共享池中。

oracle內(nèi)存架構(gòu)(三)

程序單元和庫緩存

庫緩存包含PL/SQL程序和Java類的可執(zhí)行形式。這些項(xiàng)目統(tǒng)稱為程序單元。

數(shù)據(jù)庫處理程序單元與處理SQL語句類似。例如,數(shù)據(jù)庫分配一個(gè)共享區(qū)域來保存解析的、已編譯的PL/SQL程序的形式。數(shù)據(jù)庫分配一個(gè)私有區(qū)域來保存特定于運(yùn)行該程序的會話值,包括本地、全局和包變量,以及執(zhí)行SQL的緩沖區(qū)。如果多個(gè)用戶運(yùn)行相同的程序,那么每個(gè)用戶都維護(hù)自己的私有SQL區(qū)域的一個(gè)單獨(dú)的副本,該副本包含特定于會話的值,并訪問單個(gè)共享的SQL區(qū)域。

數(shù)據(jù)庫在PL/SQL程序單元內(nèi)處理單個(gè)SQL語句,如前所述。盡管這些SQL語句起源于PL/SQL程序單元,但它們使用共享區(qū)域來保存它們的解析語句并且使用每個(gè)會話的私有區(qū)域來執(zhí)行語句。

分配和重新利用共享池中的內(nèi)存區(qū)

在解析新的SQL語句時(shí),數(shù)據(jù)庫會分配共享池內(nèi)存。內(nèi)存的大小取決于語句的復(fù)雜程度。

一般情況下,共享池中的一個(gè)項(xiàng)目會被一直保持,直到它根據(jù)LRU算法被刪除。該數(shù)據(jù)庫允許多個(gè)會話使用的共享池項(xiàng)在內(nèi)存中停留,只要它們是有用的,即使創(chuàng)建該項(xiàng)目的進(jìn)程終止了。這種機(jī)制可以最小化SQL語句的開銷和處理。

如果新的項(xiàng)目需要空間,那么數(shù)據(jù)庫就可以將不常用的項(xiàng)目所占用的空間釋放掉。共享的SQL區(qū)域可以從共享池中刪除,即使共享的SQL區(qū)域?qū)?yīng)于不長使用的開放游標(biāo)。如果隨后使用open cursor運(yùn)行它的語句,oracle數(shù)據(jù)庫就會對語句進(jìn)行修復(fù),并分配一個(gè)新的共享SQL區(qū)域。

數(shù)據(jù)庫在以下情況下從共享池中刪除共享的SQL區(qū)域:

·如果數(shù)據(jù)庫收集表、表集群或索引的統(tǒng)計(jì)信息,那么在默認(rèn)情況下,數(shù)據(jù)庫將逐漸刪除包含在一段時(shí)間之后引用分析對象的語句的所有共享SQL區(qū)域。下一次運(yùn)行刪除語句時(shí),數(shù)據(jù)庫在一個(gè)新的共享SQL區(qū)域中解析它,以反映模式對象的新統(tǒng)計(jì)數(shù)據(jù)。

·如果一個(gè)模式對象在SQL語句中被引用,如果這個(gè)對象后來被一個(gè)DDL語句修改,那么該數(shù)據(jù)庫就會使共享的SQL區(qū)域失效。在下一次運(yùn)行時(shí),優(yōu)化器必須重新解析該語句。

·如果更改全局?jǐn)?shù)據(jù)庫名稱(全局?jǐn)?shù)據(jù)庫名稱=數(shù)據(jù)庫名+數(shù)據(jù)庫域名,如:oradb.fj.jtyz),則數(shù)據(jù)庫將會從共享池中刪除所有信息。

為了評估數(shù)據(jù)庫實(shí)例重啟后可能出現(xiàn)的性能問題,請使用ALTER SYSTEM FLUSH SHARED_POOL語句手動刪除共享池中的所有信息。

數(shù)據(jù)字典緩存

數(shù)據(jù)字典是數(shù)據(jù)庫表和視圖的集合,包含關(guān)于數(shù)據(jù)庫、其結(jié)構(gòu)和用戶的參考信息。

oracle數(shù)據(jù)庫經(jīng)常在SQL語句解析期間訪問數(shù)據(jù)字典。在oracle數(shù)據(jù)庫中經(jīng)常訪問數(shù)據(jù)字典,指定以下特殊內(nèi)存位置來存放字典數(shù)據(jù):

    ·數(shù)據(jù)字典緩存

    這個(gè)緩存包含關(guān)于數(shù)據(jù)庫對象的信息。緩存也被稱為行緩存,因?yàn)樗鼘?shù)據(jù)保存為行而不是緩沖區(qū)。

    ·庫緩存

所有服務(wù)器進(jìn)程共享這些緩存,以便訪問數(shù)據(jù)字典信息。

服務(wù)結(jié)果緩存

服務(wù)器結(jié)果緩存是共享池中的一個(gè)內(nèi)存池。與緩沖池不同,服務(wù)器結(jié)果緩存包含結(jié)果集,而不是數(shù)據(jù)塊。

服務(wù)器結(jié)果緩存包含SQL查詢結(jié)果緩存和PL/SQL函數(shù)結(jié)果緩存,它們共享相同的基礎(chǔ)結(jié)構(gòu)。

客戶端結(jié)果緩存與服務(wù)器結(jié)果緩存不同??蛻舳司彺媸菓?yīng)用程序級別配置的,它位于客戶機(jī)內(nèi)存中,而不是在數(shù)據(jù)庫內(nèi)存中。

SQL查詢結(jié)果緩存

SQL查詢結(jié)果緩存是服務(wù)器結(jié)果緩存的一個(gè)子集,它存儲查詢和查詢片段的結(jié)果。

大多數(shù)應(yīng)用程序都得益于這種性能改進(jìn)??紤]到一個(gè)重復(fù)的運(yùn)行相同的select語句的應(yīng)用程序。如果結(jié)果被緩存,那么數(shù)據(jù)庫將立即返回它們。這樣,數(shù)據(jù)庫避免了重新運(yùn)行塊和重新計(jì)算結(jié)果的昂貴操作。

當(dāng)查詢執(zhí)行時(shí),數(shù)據(jù)庫搜索內(nèi)存,以確定結(jié)果緩存中是否存在結(jié)果。如果結(jié)果存在,那么數(shù)據(jù)庫將從內(nèi)存中檢索結(jié)果而不是執(zhí)行查詢。如果沒有緩存結(jié)果,則數(shù)據(jù)庫執(zhí)行查詢并將結(jié)果返回,然后將結(jié)果存儲在結(jié)果緩存中。每當(dāng)事務(wù)修改用于構(gòu)造緩存結(jié)果的數(shù)據(jù)庫對象的數(shù)據(jù)或元數(shù)據(jù)時(shí),數(shù)據(jù)庫就會自動地使緩存的結(jié)果失效。

用戶可以使用RESULT_CACHE提示對查詢或查詢片段進(jìn)行注釋,以指示數(shù)據(jù)庫應(yīng)該存儲在SQL查詢結(jié)果緩存中的結(jié)果。RESULT_CACHE_MODE初始化參數(shù)確定SQL查詢結(jié)果緩存是否用于所有查詢,還是僅僅用于帶注釋的查詢。

PL/SQL函數(shù)結(jié)果緩存

PL/SQL函數(shù)結(jié)果緩存是存儲函數(shù)結(jié)果集的服務(wù)器結(jié)果緩存的子集。

如果沒有緩存,那么1000個(gè)函數(shù)調(diào)用(1s/個(gè))將花費(fèi)1000秒的時(shí)間。有了緩存,使用相同輸入的1000個(gè)函數(shù)調(diào)用的只會花費(fèi)1秒的時(shí)間。結(jié)果緩存的優(yōu)秀候選函數(shù)經(jīng)常被調(diào)用,這些函數(shù)依賴于相對靜態(tài)的數(shù)據(jù)。

PL/SQL函數(shù)代碼可以包含一個(gè)請求來緩存它的結(jié)果。在調(diào)用這個(gè)函數(shù)時(shí),系統(tǒng)檢查緩存。如果緩存包含先前使用相同參數(shù)值的函數(shù)調(diào)用的結(jié)果,那么系統(tǒng)將直接會把緩存值返回給請求者,并且數(shù)據(jù)庫不會再執(zhí)行該函數(shù)體。如果緩存不包含結(jié)果,那么系統(tǒng)將執(zhí)行該函數(shù)體,并將對于這些參數(shù)值的結(jié)果添加到緩存中,然后將控制權(quán)返回給調(diào)用者。

你可以指定oracle數(shù)據(jù)庫使用的數(shù)據(jù)庫對象來計(jì)算緩存的結(jié)果,因此如果它們中的任何一個(gè)被更新,那么緩存的結(jié)果就會變得無效,并且必須重新計(jì)算。

緩存可以積累很多結(jié)果——一個(gè)結(jié)果是每一個(gè)被調(diào)用的參數(shù)值的唯一組合。如果數(shù)據(jù)庫需要更多的內(nèi)存,那么它就需要計(jì)算出一個(gè)或多個(gè)緩存的結(jié)果。

保留池

保留池是oracle數(shù)據(jù)庫可以用來分配大量連續(xù)內(nèi)存塊的共享池中的內(nèi)存區(qū)域。

數(shù)據(jù)庫從共享池中分配內(nèi)存。塊允許大型對象(超過5Kb)加載到緩存中,而不需要請求單個(gè)相鄰區(qū)域。這樣,數(shù)據(jù)庫就減少了因?yàn)樗槠谋M連續(xù)內(nèi)存的可能性。

不同尋常的是,Java、PL/SQL或SQL游標(biāo)可能會從大于5kb的共享池中進(jìn)行分配的。為了讓這些分配最有效的進(jìn)行,數(shù)據(jù)庫將一小部分共享池隔離在預(yù)留的池中。

大池

大池是一個(gè)可選的內(nèi)存區(qū)域,用于內(nèi)存分配,大于共享池的內(nèi)存分配。

大池可以為下面的內(nèi)容提供大內(nèi)存分配:

·為共享服務(wù)器和oracle XA接口(在事務(wù)與多個(gè)數(shù)據(jù)庫交互的地方使用UGA)

·用于并行執(zhí)行語句的消息緩沖區(qū)

·用于恢復(fù)管理器(RMAN)I/O slaves 緩沖區(qū)

通過大池中分配會話內(nèi)存,數(shù)據(jù)庫可以避免在從共享池分配內(nèi)存時(shí)發(fā)生的內(nèi)存碎片。當(dāng)數(shù)據(jù)庫將大池內(nèi)存分配到會話時(shí),除非會話主動釋放該內(nèi)存,否則內(nèi)存不能被釋放。相反,數(shù)據(jù)庫在共享池中以LRU方式管理內(nèi)存,這意味著內(nèi)存部分可以老化。

下圖是大池的結(jié)構(gòu)圖:

oracle內(nèi)存架構(gòu)(三)

大池與共享池中的預(yù)留空間不同,共享池使用與共享池中分配的其它內(nèi)存相同的LRU列表。大池沒有LRU列表。內(nèi)存塊分配并不能釋放,直到它們被使用完。一旦內(nèi)存塊被釋放,其它進(jìn)程就可以使用它。

Java 池

Java池是用來存儲在Java虛擬機(jī)(JVM)內(nèi)所有特定于會話的Java代碼和數(shù)據(jù)的內(nèi)存區(qū)域。該內(nèi)存包括在調(diào)用結(jié)束時(shí)遷移到Java會話空間的Java對象。

對于專用的服務(wù)器連接,Java池包含每個(gè)Java類的共享部分,包括方法和只讀內(nèi)存,如代碼向量,而不是每個(gè)會話的Java狀態(tài)。對于共享服務(wù)器,池包含每個(gè)類的共享部分和每個(gè)會話狀態(tài)的一些UGA。每個(gè)UGA都在必要時(shí)增長和收縮,但是UGA的總大小必須適合于Java池空間。

Java Pool Advisor統(tǒng)計(jì)信息提供了有關(guān)用于Java的庫緩存內(nèi)存信息,并預(yù)測Java池大小的變化如何影響解析速率。當(dāng)statistics_level設(shè)置為典型或更高時(shí),Java Pool Advisor在內(nèi)部打開,當(dāng)advisor關(guān)閉時(shí)這些信息將被重置。

流池

流池存儲緩存隊(duì)列信息,并為oracle流捕獲過程和應(yīng)用程序提供內(nèi)存。流池僅由oracle流使用。

除非特別地配置它,否則流池的大小從0開始。池大小按oracle流的要求動態(tài)增長。

混合SGA區(qū)域

固定的SGA是一個(gè)內(nèi)部管理區(qū)域。

比如,固定SGA區(qū)包括:

·那些后臺進(jìn)程需要訪問的關(guān)于數(shù)據(jù)庫和實(shí)例的一般信息

·進(jìn)程之間傳遞的信息,比如關(guān)于鎖的信息

固定SGA大小是由oracle數(shù)據(jù)庫設(shè)置的,不能手動更改。固定SGA大小可以通過釋放空間而得到改變。

軟件代碼區(qū)概述

軟件代碼區(qū)域是存儲正在運(yùn)行或可以運(yùn)行的代碼的一部分內(nèi)存。oracle數(shù)據(jù)庫代碼存儲在一個(gè)通常比用戶程序的位置更具有排他性和受保護(hù)的軟件區(qū)域。

軟件代碼區(qū)通常都是靜態(tài)的大小,只會在軟件更新或重裝的情況下改變大小。這些領(lǐng)域所需的大小因操作系統(tǒng)而異。

軟件代碼區(qū)是只讀的,可以安裝共享或非共享。一些數(shù)據(jù)庫工具和實(shí)用工具,如oracle forms和SQL*PLUS,可以安裝共享。在可能的情況下,共享數(shù)據(jù)庫代碼,這樣所有用戶都可以訪問它,而不會在內(nèi)存中有多個(gè)副本,從而讓主要內(nèi)存和性能的整體提高。如果在同一臺計(jì)算機(jī)上運(yùn)行數(shù)據(jù)庫,數(shù)據(jù)庫的多個(gè)實(shí)例可以使用相同的數(shù)據(jù)庫代碼區(qū)域。

安裝軟件共享的選項(xiàng)對于所有操作系統(tǒng)都是不可用的,例如,在運(yùn)行windows操作系統(tǒng)的個(gè)人電腦上。

文章標(biāo)題:oracle內(nèi)存架構(gòu)(三)
本文URL:http://bm7419.com/article32/isgjpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航App開發(fā)、移動網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站改版

廣告

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

網(wǎng)站托管運(yùn)營