共享池
目前創(chuàng)新互聯建站已為近千家的企業(yè)提供了網站建設、域名、虛擬主機、網站托管運營、企業(yè)網站設計、坪山網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發(fā)展。共享池緩存各種類型的程序數據。
例如,共享池存儲解析SQL、PL/SQL代碼、系統參數和數據字典信息。共享池涉及到數據庫中發(fā)生的幾乎所有的操作。例如,如果用戶執(zhí)行SQL語句,則oracle數據庫訪問共享池。
共享池分為幾個組件,其中最重要的部分如下圖所示:
這些結構包括:
·庫緩存
·數據字典緩存
·服務器結果緩存
·保留池
庫緩存詳解
庫緩存是存儲可執(zhí)行SQL和PL/SQL代碼的共享池內存結構。
該緩存包含共享的SQL和PL/SQL區(qū)和控制結構,如鎖和庫緩存句柄。在共享服務器架構中,庫緩存還包含私有的SQL區(qū)域。
當執(zhí)行SQL語句時,數據庫嘗試重用以前執(zhí)行的代碼。如果一個SQL語句的解析存在于庫緩存并且可以被共享,那么數據庫就會重用該代碼,稱為軟解析或庫緩存命中(cache hit)。否則,數據庫必須構建應用程序的新的可執(zhí)行版本,稱為硬解析或緩存遺漏(cache miss)。
共享SQL區(qū)
數據庫會處理每個運行在共享SQL區(qū)和私有SQL區(qū)的SQL語句。
數據庫在共享SQL區(qū)處理第一次出現的SQL語句,該區(qū)域可被所有用戶訪問,并且包含語句解析樹和執(zhí)行計劃。對于每一個唯一的SQL語句,只存在一個共享的SQL區(qū)。每個會話發(fā)出一個SQL語句都會在PGA中產生一個私有SQL區(qū)與之對應,即便是不同會話提交相同的SQL語句,但是每個會話都會有屬于自己的SQL區(qū)。PGA中每個私有的SQL區(qū)都會與共享SQL區(qū)相關聯。
當應用程序提交類似的SQL語句時,數據庫將自動確定。數據庫同時考慮由用戶和應用程序直接發(fā)出的SQL語句,以及語句在內部發(fā)出的遞歸SQL語句。
數據庫執(zhí)行以下步驟:
1、檢查共享池,查看在共享SQL區(qū)域是否存在語法語義相似的語句
·如果存在相同的語句,那么數據庫將會直接使用它們,從而減少內存消耗。
·如果不存在相同的語句,那么數據庫將會在共享池中分配一個新的共享SQL區(qū)。具有相同語法 但不同語意的語句使用子游標。
在這兩種情況中,用戶的私有SQL區(qū)域指向包含語句和執(zhí)行計劃的共享SQL區(qū)域。
2、為會話分配一個私有的SQL區(qū)域
私有SQL區(qū)域的位置取決于會話建立的連接方式。如果會話是通過共享服務器連接,那么私有SQL區(qū)域的一部分將會保留在SGA中。
下圖顯示了一個專用的服務器架構,其中兩個會話在它們自己的PGA中保留同一SQL語句的副本。在共享服務器中,此副本位于UGA,它位于大池中,當大池不存在時副本則會存在于共享池中。
程序單元和庫緩存
庫緩存包含PL/SQL程序和Java類的可執(zhí)行形式。這些項目統稱為程序單元。
數據庫處理程序單元與處理SQL語句類似。例如,數據庫分配一個共享區(qū)域來保存解析的、已編譯的PL/SQL程序的形式。數據庫分配一個私有區(qū)域來保存特定于運行該程序的會話值,包括本地、全局和包變量,以及執(zhí)行SQL的緩沖區(qū)。如果多個用戶運行相同的程序,那么每個用戶都維護自己的私有SQL區(qū)域的一個單獨的副本,該副本包含特定于會話的值,并訪問單個共享的SQL區(qū)域。
數據庫在PL/SQL程序單元內處理單個SQL語句,如前所述。盡管這些SQL語句起源于PL/SQL程序單元,但它們使用共享區(qū)域來保存它們的解析語句并且使用每個會話的私有區(qū)域來執(zhí)行語句。
分配和重新利用共享池中的內存區(qū)
在解析新的SQL語句時,數據庫會分配共享池內存。內存的大小取決于語句的復雜程度。
一般情況下,共享池中的一個項目會被一直保持,直到它根據LRU算法被刪除。該數據庫允許多個會話使用的共享池項在內存中停留,只要它們是有用的,即使創(chuàng)建該項目的進程終止了。這種機制可以最小化SQL語句的開銷和處理。
如果新的項目需要空間,那么數據庫就可以將不常用的項目所占用的空間釋放掉。共享的SQL區(qū)域可以從共享池中刪除,即使共享的SQL區(qū)域對應于不長使用的開放游標。如果隨后使用open cursor運行它的語句,oracle數據庫就會對語句進行修復,并分配一個新的共享SQL區(qū)域。
數據庫在以下情況下從共享池中刪除共享的SQL區(qū)域:
·如果數據庫收集表、表集群或索引的統計信息,那么在默認情況下,數據庫將逐漸刪除包含在一段時間之后引用分析對象的語句的所有共享SQL區(qū)域。下一次運行刪除語句時,數據庫在一個新的共享SQL區(qū)域中解析它,以反映模式對象的新統計數據。
·如果一個模式對象在SQL語句中被引用,如果這個對象后來被一個DDL語句修改,那么該數據庫就會使共享的SQL區(qū)域失效。在下一次運行時,優(yōu)化器必須重新解析該語句。
·如果更改全局數據庫名稱(全局數據庫名稱=數據庫名+數據庫域名,如:oradb.fj.jtyz),則數據庫將會從共享池中刪除所有信息。
為了評估數據庫實例重啟后可能出現的性能問題,請使用ALTER SYSTEM FLUSH SHARED_POOL語句手動刪除共享池中的所有信息。
數據字典緩存
數據字典是數據庫表和視圖的集合,包含關于數據庫、其結構和用戶的參考信息。
oracle數據庫經常在SQL語句解析期間訪問數據字典。在oracle數據庫中經常訪問數據字典,指定以下特殊內存位置來存放字典數據:
·數據字典緩存
這個緩存包含關于數據庫對象的信息。緩存也被稱為行緩存,因為它將數據保存為行而不是緩沖區(qū)。
·庫緩存
所有服務器進程共享這些緩存,以便訪問數據字典信息。
服務結果緩存
服務器結果緩存是共享池中的一個內存池。與緩沖池不同,服務器結果緩存包含結果集,而不是數據塊。
服務器結果緩存包含SQL查詢結果緩存和PL/SQL函數結果緩存,它們共享相同的基礎結構。
客戶端結果緩存與服務器結果緩存不同??蛻舳司彺媸菓贸绦蚣墑e配置的,它位于客戶機內存中,而不是在數據庫內存中。
SQL查詢結果緩存
SQL查詢結果緩存是服務器結果緩存的一個子集,它存儲查詢和查詢片段的結果。
大多數應用程序都得益于這種性能改進??紤]到一個重復的運行相同的select語句的應用程序。如果結果被緩存,那么數據庫將立即返回它們。這樣,數據庫避免了重新運行塊和重新計算結果的昂貴操作。
當查詢執(zhí)行時,數據庫搜索內存,以確定結果緩存中是否存在結果。如果結果存在,那么數據庫將從內存中檢索結果而不是執(zhí)行查詢。如果沒有緩存結果,則數據庫執(zhí)行查詢并將結果返回,然后將結果存儲在結果緩存中。每當事務修改用于構造緩存結果的數據庫對象的數據或元數據時,數據庫就會自動地使緩存的結果失效。
用戶可以使用RESULT_CACHE提示對查詢或查詢片段進行注釋,以指示數據庫應該存儲在SQL查詢結果緩存中的結果。RESULT_CACHE_MODE初始化參數確定SQL查詢結果緩存是否用于所有查詢,還是僅僅用于帶注釋的查詢。
PL/SQL函數結果緩存
PL/SQL函數結果緩存是存儲函數結果集的服務器結果緩存的子集。
如果沒有緩存,那么1000個函數調用(1s/個)將花費1000秒的時間。有了緩存,使用相同輸入的1000個函數調用的只會花費1秒的時間。結果緩存的優(yōu)秀候選函數經常被調用,這些函數依賴于相對靜態(tài)的數據。
PL/SQL函數代碼可以包含一個請求來緩存它的結果。在調用這個函數時,系統檢查緩存。如果緩存包含先前使用相同參數值的函數調用的結果,那么系統將直接會把緩存值返回給請求者,并且數據庫不會再執(zhí)行該函數體。如果緩存不包含結果,那么系統將執(zhí)行該函數體,并將對于這些參數值的結果添加到緩存中,然后將控制權返回給調用者。
你可以指定oracle數據庫使用的數據庫對象來計算緩存的結果,因此如果它們中的任何一個被更新,那么緩存的結果就會變得無效,并且必須重新計算。
緩存可以積累很多結果——一個結果是每一個被調用的參數值的唯一組合。如果數據庫需要更多的內存,那么它就需要計算出一個或多個緩存的結果。
保留池
保留池是oracle數據庫可以用來分配大量連續(xù)內存塊的共享池中的內存區(qū)域。
數據庫從共享池中分配內存。塊允許大型對象(超過5Kb)加載到緩存中,而不需要請求單個相鄰區(qū)域。這樣,數據庫就減少了因為碎片而耗盡連續(xù)內存的可能性。
不同尋常的是,Java、PL/SQL或SQL游標可能會從大于5kb的共享池中進行分配的。為了讓這些分配最有效的進行,數據庫將一小部分共享池隔離在預留的池中。
大池
大池是一個可選的內存區(qū)域,用于內存分配,大于共享池的內存分配。
大池可以為下面的內容提供大內存分配:
·為共享服務器和oracle XA接口(在事務與多個數據庫交互的地方使用UGA)
·用于并行執(zhí)行語句的消息緩沖區(qū)
·用于恢復管理器(RMAN)I/O slaves 緩沖區(qū)
通過大池中分配會話內存,數據庫可以避免在從共享池分配內存時發(fā)生的內存碎片。當數據庫將大池內存分配到會話時,除非會話主動釋放該內存,否則內存不能被釋放。相反,數據庫在共享池中以LRU方式管理內存,這意味著內存部分可以老化。
下圖是大池的結構圖:
大池與共享池中的預留空間不同,共享池使用與共享池中分配的其它內存相同的LRU列表。大池沒有LRU列表。內存塊分配并不能釋放,直到它們被使用完。一旦內存塊被釋放,其它進程就可以使用它。
Java 池
Java池是用來存儲在Java虛擬機(JVM)內所有特定于會話的Java代碼和數據的內存區(qū)域。該內存包括在調用結束時遷移到Java會話空間的Java對象。
對于專用的服務器連接,Java池包含每個Java類的共享部分,包括方法和只讀內存,如代碼向量,而不是每個會話的Java狀態(tài)。對于共享服務器,池包含每個類的共享部分和每個會話狀態(tài)的一些UGA。每個UGA都在必要時增長和收縮,但是UGA的總大小必須適合于Java池空間。
Java Pool Advisor統計信息提供了有關用于Java的庫緩存內存信息,并預測Java池大小的變化如何影響解析速率。當statistics_level設置為典型或更高時,Java Pool Advisor在內部打開,當advisor關閉時這些信息將被重置。
流池
流池存儲緩存隊列信息,并為oracle流捕獲過程和應用程序提供內存。流池僅由oracle流使用。
除非特別地配置它,否則流池的大小從0開始。池大小按oracle流的要求動態(tài)增長。
混合SGA區(qū)域
固定的SGA是一個內部管理區(qū)域。
比如,固定SGA區(qū)包括:
·那些后臺進程需要訪問的關于數據庫和實例的一般信息
·進程之間傳遞的信息,比如關于鎖的信息
固定SGA大小是由oracle數據庫設置的,不能手動更改。固定SGA大小可以通過釋放空間而得到改變。
軟件代碼區(qū)概述
軟件代碼區(qū)域是存儲正在運行或可以運行的代碼的一部分內存。oracle數據庫代碼存儲在一個通常比用戶程序的位置更具有排他性和受保護的軟件區(qū)域。
軟件代碼區(qū)通常都是靜態(tài)的大小,只會在軟件更新或重裝的情況下改變大小。這些領域所需的大小因操作系統而異。
軟件代碼區(qū)是只讀的,可以安裝共享或非共享。一些數據庫工具和實用工具,如oracle forms和SQL*PLUS,可以安裝共享。在可能的情況下,共享數據庫代碼,這樣所有用戶都可以訪問它,而不會在內存中有多個副本,從而讓主要內存和性能的整體提高。如果在同一臺計算機上運行數據庫,數據庫的多個實例可以使用相同的數據庫代碼區(qū)域。
安裝軟件共享的選項對于所有操作系統都是不可用的,例如,在運行windows操作系統的個人電腦上。
另外有需要云服務器可以了解下創(chuàng)新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享標題:oracle內存架構(三)-創(chuàng)新互聯
URL分享:http://jinyejixie.com/article6/csdeig.html
成都網站建設公司_創(chuàng)新互聯,為您提供品牌網站制作、小程序開發(fā)、網站營銷、做網站、軟件開發(fā)、自適應網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯