您好,登錄后才能下訂單哦!
這篇文章主要介紹“Oracle內(nèi)存結(jié)構(gòu)面試題有哪些”,在日常操作中,相信很多人在Oracle內(nèi)存結(jié)構(gòu)面試題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”O(jiān)racle內(nèi)存結(jié)構(gòu)面試題有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
一:Oracle內(nèi)存結(jié)構(gòu)由哪幾部分組成?
1 User global area (UGA)
2 Program global area (PGA)
3 System global area (SGA)
4 軟件代碼區(qū)Software code areas
二:請(qǐng)分別介紹下UGA、PGA、SGA、軟件代碼區(qū)?
1 UGA
UGA是用戶全局區(qū),主要存放用戶會(huì)話的相關(guān)信息,比如登錄信息。
在會(huì)話的生命周期內(nèi),UGA必須對(duì)數(shù)據(jù)庫(kù)會(huì)話可用。
所以,在連接模式是專用服務(wù)器連接模式時(shí),也就是一個(gè)會(huì)話對(duì)應(yīng)一個(gè)連接,UGA存儲(chǔ)在PGA中。
但是在連接模式是共享服務(wù)器時(shí),也就是多個(gè)會(huì)話對(duì)應(yīng)一個(gè)連接,UGA存儲(chǔ)在SGA中的large pool,如果large pool空間不夠,UGA會(huì)存儲(chǔ)在shared pool。大多情況下都使用專用服務(wù)器連接模式。
2 PGA
PGA(Process Global Area)程序全局區(qū),PGA是一個(gè)非共享內(nèi)存區(qū)域,它包含Oracle進(jìn)程專用的數(shù)據(jù)和控制信息。在Oracle進(jìn)程啟動(dòng)時(shí)創(chuàng)建PGA。由每個(gè)服務(wù)進(jìn)程和后臺(tái)進(jìn)程專有,所有單個(gè)PGA的集合就是總實(shí)例PGA大小。
PGA內(nèi)容:
PGA主要有兩個(gè)區(qū)域,私有SQL區(qū)域、SQL工作區(qū)域。
私有SQL區(qū)域存儲(chǔ)SQL的綁定變量值、查詢執(zhí)行狀態(tài)信息,客戶端進(jìn)程負(fù)責(zé)管理私有SQL區(qū)域。分配的私有SQL區(qū)域的數(shù)量受初始化參數(shù)OPEN_CURSORS的限制。
SQL工作區(qū)主要用于排序操作、Hash連接、位圖合并連接時(shí)使用的內(nèi)存。
比如 order by、group by等操作。
PGA管理:
在Oracle8i 中,PGA調(diào)整非常復(fù)雜,要調(diào)整SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE、 CREATE_BITMAP_AREA_SIZE等參數(shù)。在ORACLE9I以后,只需要調(diào)整 PGA_AGGREGATE_TARGET,這個(gè)值是個(gè)軟限制,比如設(shè)置大小2G,只是一個(gè)目標(biāo)值,實(shí)際上PGA大小可以超過2G。在12C開始引入PGA_AGGREGATE_LIMIT參數(shù)限制Oracle實(shí)例PGA使用內(nèi)存的上限,如果超過限制就采取終止會(huì)話的方式來(lái)降低PGA內(nèi)存的使用量。
3 SGA
系統(tǒng)全局區(qū)域(SGA),是一組共享內(nèi)存結(jié)構(gòu),所有服務(wù)器和后臺(tái)進(jìn)程共享SGA。
與Oracle后臺(tái)進(jìn)程一起構(gòu)成數(shù)據(jù)庫(kù)實(shí)例。
可以在V$SGASTAT視圖中查詢關(guān)于SGA組件的信息。最重要的SGA組件如下:
?Database Buffer Cache
?Shared Pool
?Redo Log Buffer
?In-Memory Area
?Large Pool
?Java Pool
?Fixed SGA
?可選的與性能相關(guān)的SGA子區(qū)域
(1)Database Buffer Cache
數(shù)據(jù)庫(kù)緩沖區(qū)緩存,也稱為緩沖區(qū)緩存,是數(shù)據(jù)文件上的數(shù)據(jù)塊在內(nèi)存中的副本。主要是為了在內(nèi)存中進(jìn)行高速的數(shù)據(jù)查找和更新,盡量減少磁盤的IO操作。也是SGA中占比比較大的一塊內(nèi)存區(qū)域。用戶訪問DB Cache 的數(shù)據(jù)比訪問磁盤上的數(shù)據(jù)速度更快數(shù)(內(nèi)存的讀取效率是磁盤讀取效率約14000倍),因此應(yīng)用系統(tǒng)應(yīng)該盡可能多地從DB Cache中訪問數(shù)據(jù)。在大多數(shù)情況下,DB Cache 的命中率越高,訪問性能就越好。
緩沖池包括:default默認(rèn)池、keep保留池、recycle回收池
Buffer Cache管理:
通過三條鏈表進(jìn)行管理:HASH鏈表、檢查點(diǎn)隊(duì)列鏈表、LRU鏈表
HASH鏈表
HASH鏈表的作用是通過HASH算法(消耗CPU資源),提高DB Cache中數(shù)據(jù)塊的定位速度。也就是邏輯讀。
比如,根據(jù)需要訪問塊的塊號(hào)、文件號(hào)計(jì)算HASH值,在通過HASH值找到對(duì)應(yīng)的HASH Bucket,搜索Buckect后的鏈表,找到目標(biāo)BH(Buffer Header),通過BH找到BA(Buffer Address),按照BA訪問具體的Buffer,這個(gè)就是邏輯讀的過程。
檢查點(diǎn)隊(duì)列鏈表(CKPT-Q)
主要用于記錄臟塊。
Buffer Cache其實(shí)就是磁盤數(shù)據(jù)文件的緩存,以修改塊的操作為例,如update,只是修改Buffer Cache中的Buffer,修改完成后,update操作就算完工了。這樣Buffer中的數(shù)據(jù)和磁盤中的block就不一致了,這樣的Buffer就是臟Buffer,臟塊由DBWR進(jìn)程統(tǒng)一寫磁盤,但是Buffer Cache通常很大,有幾萬(wàn)或幾十萬(wàn)Bufeer,怎么在Buffer Cache中找到哪些是臟Buffer呢,這就需要一個(gè)鏈表,將所有臟Buffer都串起來(lái),DBWR寫臟塊時(shí),就是按照這個(gè)串起來(lái)的鏈表的順序來(lái)寫,這樣的臟鏈表有兩個(gè),一個(gè)是LRUW,另一個(gè)是CKPT-Q。在buffer cache中,修改完數(shù)據(jù)后,會(huì)將對(duì)應(yīng)的數(shù)據(jù)塊加入到檢查點(diǎn)隊(duì)列(CKPT-Q)。
LRU鏈表(最近最少使用鏈表)
物理讀時(shí),服務(wù)器進(jìn)程將數(shù)據(jù)塊從數(shù)據(jù)文件讀進(jìn)Buffer Cache中,假如Buffer Cache有10000個(gè)Buffer,那么進(jìn)程應(yīng)該覆蓋哪個(gè)Buffer呢?
簡(jiǎn)單說,就是進(jìn)程將數(shù)據(jù)塊讀進(jìn)Buffer Cache的什么地方。
答案是,覆蓋最不常用的Buffer,LRU主要就是解決如何快速找到最不常用的Buffer。
在Oracle 8i之前,LRU算法是,DB Cache在LRU上是會(huì)移動(dòng)的,常用的緩沖會(huì)被換到LRU的熱端,不常用的緩沖會(huì)被擠到LRU的冷端,一般來(lái)說會(huì)話分配Cache時(shí),會(huì)從LRU的冷端開始查找。這種LRU算法會(huì)產(chǎn)生性能瓶頸。
從 Oracle 8i 開始,LRU 的算法有所改進(jìn),LRU 鏈上的緩沖不再需要移動(dòng)了,而是通過 tch計(jì)數(shù)器大小值來(lái)判斷某個(gè)數(shù)據(jù)塊是否為熱塊。
(2)Redo Log Buffer
重做日志緩沖區(qū)是SGA中的一個(gè)循環(huán)緩沖區(qū),它存儲(chǔ)描述數(shù)據(jù)庫(kù)更改的重做條目。
重做記錄是一種數(shù)據(jù)結(jié)構(gòu),它包含重做DML或DDL操作對(duì)數(shù)據(jù)庫(kù)所做更改所需的信息。數(shù)據(jù)庫(kù)恢復(fù)將重做項(xiàng)應(yīng)用于數(shù)據(jù)文件以重構(gòu)丟失的更改。
LGWR按順序?qū)?shù)據(jù)塊寫入磁盤,而DBW將數(shù)據(jù)塊分散寫入磁盤。分散寫比順序?qū)懸枚?。因?yàn)長(zhǎng)GWR允許用戶避免等待DBW完成緩慢的寫操作,所以數(shù)據(jù)庫(kù)提供了更好的性能。
LOG_BUFFER初始化參數(shù)指定Oracle數(shù)據(jù)庫(kù)在緩沖重做條目時(shí)使用的內(nèi)存量。與其他SGA組件不同,重做日志緩沖區(qū)和固定SGA緩沖區(qū)不會(huì)將內(nèi)存分成顆粒。
(3)Shared Pool
相比于Buffer Cache,共享池中的內(nèi)容可謂是雜亂無(wú)章。Oracle基本上將不能放進(jìn)Buffer Cache中的數(shù)據(jù)都扔進(jìn)了共享池,使得共享池的分配和釋放極為頻繁。
共享池中最基本的內(nèi)存分配單元成為Chunk,相當(dāng)于Buffer Cache中的Buffer或塊的概念。
Chunk的大小極不統(tǒng)一,最新的Chunk可以只有十來(lái)個(gè)字節(jié),最大的Chunk有幾十兆甚至幾百兆?;緝?nèi)存單元大小的不統(tǒng)一,再加上頻繁進(jìn)行分配、釋放操作,使共享池中極易產(chǎn)生內(nèi)存碎片??偟膩?lái)說,共享池是Oracle中最復(fù)雜的內(nèi)存池。
包括以下內(nèi)容:
?Library Cache
?Data Dictionary Cache
?Server Result Cache
?Reserved Pool
1 Library Cache
庫(kù)緩存主要存儲(chǔ)用戶提交的SQL語(yǔ)句、SQL語(yǔ)句相關(guān)解析數(shù)、SQL執(zhí)行計(jì)劃、PL/SQL程序塊等。
2 Data Dictionary Cache
dictionary cache里存放了數(shù)據(jù)字典的內(nèi)存結(jié)構(gòu),包括表的定義、Storage信息、用戶權(quán)限信息、約束定義、表的統(tǒng)計(jì)信息等。SQL語(yǔ)句解析期間頻繁地訪問數(shù)據(jù)字典。構(gòu)造dictionary cache的目的是為了加快SQL解析過程中語(yǔ)義解析的速度。
數(shù)據(jù)字典緩存也被稱為行緩存(Row Cache),因?yàn)樗且杂涗浶袨閱卧鎯?chǔ)數(shù)據(jù)的,而不像 Buffer Cache 是以數(shù)據(jù)塊為單元存儲(chǔ)數(shù)據(jù)。
3 Server Result Cache
服務(wù)器結(jié)果緩存是共享池中的內(nèi)存池。與緩沖池不同,服務(wù)器結(jié)果緩存保存結(jié)果集,而不是數(shù)據(jù)塊。
執(zhí)行查詢時(shí),數(shù)據(jù)庫(kù)將確定查詢結(jié)果是否存在于查詢結(jié)果緩存中,如果結(jié)果存在,那么數(shù)據(jù)庫(kù)將從緩存中檢索它,而不是執(zhí)行查詢。緩存使數(shù)據(jù)庫(kù)能夠避免重新讀取數(shù)據(jù)塊和重新計(jì)算結(jié)果的昂貴操作。
4 Reserved Pool
保留池是共享池中的一個(gè)內(nèi)存區(qū)域,Oracle數(shù)據(jù)庫(kù)可以使用它來(lái)分配大的連續(xù)內(nèi)存塊。
如果Oracle解析一個(gè)PL/SQL程序單元,也需要從共享池中分配內(nèi)存給這些程序單元對(duì)象。由于這些對(duì)象本一般比較大(如包),所以分配的內(nèi)存空間也相對(duì)較大。系統(tǒng)經(jīng)過長(zhǎng)時(shí)間運(yùn)行后,共享池可能存在大量?jī)?nèi)存碎片,導(dǎo)致無(wú)法滿足對(duì)于大塊內(nèi)存段的分配。為了使有足夠空間緩存大程序塊,Oracle 專門從共享池內(nèi)置出一塊區(qū)域來(lái)來(lái)分配內(nèi)存保持這些大塊。
數(shù)據(jù)庫(kù)以塊的形式從共享池分配內(nèi)存。分塊允許將大對(duì)象(超過5 KB)加載到緩存中,而不需要單個(gè)連續(xù)區(qū)域。通過這種方式,數(shù)據(jù)庫(kù)減少了內(nèi)存碎片的產(chǎn)生。
(4)Large Pool
大池是一個(gè)可選的內(nèi)存區(qū)域,用于比共享池更大的內(nèi)存分配。
大池可以為以下情況提供大內(nèi)存分配:
?用于共享服務(wù)器和Oracle XA接口(用于事務(wù)與多個(gè)數(shù)據(jù)庫(kù)交互)
?并行執(zhí)行中使用的消息緩沖區(qū)
?用于恢復(fù)管理器(RMAN) I/O從屬的緩沖區(qū)
(5)Java Pool
Java池是存儲(chǔ)Java虛擬機(jī)(JVM)中所有特定于會(huì)話的Java代碼和數(shù)據(jù)的內(nèi)存區(qū)域。此內(nèi)存包括在調(diào)用結(jié)束時(shí)遷移到Java會(huì)話空間的Java對(duì)象。
對(duì)于專用服務(wù)器連接,Java池包括每個(gè)Java類的共享部分,包括方法和只讀內(nèi)存(如代碼向量),但不包括每個(gè)會(huì)話的Java狀態(tài)。
(6)可選的與性能相關(guān)的SGA子區(qū)域
一些SGA子區(qū)域只針對(duì)特定的性能特性啟用。本節(jié)包含以下主題:
?In-Memory Area
?Memoptimize Pool
In-Memory 是12C 開始,在 SGA 中新增加的內(nèi)存區(qū)域,可以實(shí)現(xiàn)表數(shù)據(jù)按列存儲(chǔ);
In-Memory 并沒有取代傳統(tǒng)的Buffer Cache ,二者并存在 SGA 中。列式存儲(chǔ)在訪問多行、少列情況下性能更優(yōu)。
memoptimize pool大小通過MEMOPTIMIZE_POOL_SIZE設(shè)置,其中存儲(chǔ)著啟用了fast lookup表的散列索引。
從18c開始支持Memoptimized Rowstore,可用于提高查詢性能。針對(duì)頻繁基于主鍵查詢的SQL語(yǔ)句的性能提高十分明顯??梢酝ㄟ^CREATE TABLE或ALTER TABLE…MEMOPTIMIZE FOR READ語(yǔ)句來(lái)啟用表的fast lookup。
(7)軟件代碼區(qū)概述
軟件代碼區(qū)是存儲(chǔ)正在運(yùn)行或可以運(yùn)行的代碼的內(nèi)存的一部分。Oracle數(shù)據(jù)庫(kù)代碼存儲(chǔ)在一個(gè)軟件區(qū)域中,這個(gè)軟件區(qū)域通常比用戶程序的位置更具排他性和受保護(hù)性。軟件區(qū)域的大小通常是靜態(tài)的,只有在軟件更新或重新安裝時(shí)才會(huì)改變。這些區(qū)域所需的大小因操作系統(tǒng)而異。
軟件區(qū)域是只讀的,可以安裝共享的,也可以安裝非共享的。有些數(shù)據(jù)庫(kù)工具和實(shí)用程序(如Oracle Forms和SQL*Plus)可以安裝為共享的,但有些則不能。在可能的情況下,數(shù)據(jù)庫(kù)代碼是共享的,這樣所有用戶都可以訪問它,而不需要在內(nèi)存中有多個(gè)副本,從而減少了主內(nèi)存,并在總體上提高了性能。如果在同一臺(tái)計(jì)算機(jī)上運(yùn)行,數(shù)據(jù)庫(kù)的多個(gè)實(shí)例可以將相同的數(shù)據(jù)庫(kù)代碼區(qū)域用于不同的數(shù)據(jù)庫(kù)。
到此,關(guān)于“Oracle內(nèi)存結(jié)構(gòu)面試題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。