Oracle內(nèi)存結(jié)構(gòu)面試題有哪些

這篇文章主要介紹“Oracle內(nèi)存結(jié)構(gòu)面試題有哪些”,在日常操作中,相信很多人在Oracle內(nèi)存結(jié)構(gòu)面試題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”O(jiān)racle內(nèi)存結(jié)構(gòu)面試題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平潭企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站制作,平潭網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

一: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

二:請分別介紹下UGA、PGA、SGA、軟件代碼區(qū)?

1 UGA

UGA是用戶全局區(qū),主要存放用戶會話的相關(guān)信息,比如登錄信息。

在會話的生命周期內(nèi),UGA必須對數(shù)據(jù)庫會話可用。

所以,在連接模式是專用服務(wù)器連接模式時,也就是一個會話對應(yīng)一個連接,UGA存儲在PGA中。

但是在連接模式是共享服務(wù)器時,也就是多個會話對應(yīng)一個連接,UGA存儲在SGA中的large pool,如果large pool空間不夠,UGA會存儲在shared pool。大多情況下都使用專用服務(wù)器連接模式。

2 PGA

PGA(Process Global Area)程序全局區(qū),PGA是一個非共享內(nèi)存區(qū)域,它包含Oracle進(jìn)程專用的數(shù)據(jù)和控制信息。在Oracle進(jìn)程啟動時創(chuàng)建PGA。由每個服務(wù)進(jìn)程和后臺進(jìn)程專有,所有單個PGA的集合就是總實例PGA大小。

PGA內(nèi)容:

PGA主要有兩個區(qū)域,私有SQL區(qū)域、SQL工作區(qū)域。

私有SQL區(qū)域存儲SQL的綁定變量值、查詢執(zhí)行狀態(tài)信息,客戶端進(jìn)程負(fù)責(zé)管理私有SQL區(qū)域。分配的私有SQL區(qū)域的數(shù)量受初始化參數(shù)OPEN_CURSORS的限制。

SQL工作區(qū)主要用于排序操作、Hash連接、位圖合并連接時使用的內(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,這個值是個軟限制,比如設(shè)置大小2G,只是一個目標(biāo)值,實際上PGA大小可以超過2G。在12C開始引入PGA_AGGREGATE_LIMIT參數(shù)限制Oracle實例PGA使用內(nèi)存的上限,如果超過限制就采取終止會話的方式來降低PGA內(nèi)存的使用量。

3 SGA

系統(tǒng)全局區(qū)域(SGA),是一組共享內(nèi)存結(jié)構(gòu),所有服務(wù)器和后臺進(jìn)程共享SGA。

與Oracle后臺進(jìn)程一起構(gòu)成數(shù)據(jù)庫實例。

可以在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ù)庫緩沖區(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鏈表、檢查點隊列鏈表、LRU鏈表

HASH鏈表

HASH鏈表的作用是通過HASH算法(消耗CPU資源),提高DB Cache中數(shù)據(jù)塊的定位速度。也就是邏輯讀。

比如,根據(jù)需要訪問塊的塊號、文件號計算HASH值,在通過HASH值找到對應(yīng)的HASH Bucket,搜索Buckect后的鏈表,找到目標(biāo)BH(Buffer Header),通過BH找到BA(Buffer Address),按照BA訪問具體的Buffer,這個就是邏輯讀的過程。

檢查點隊列鏈表(CKPT-Q)

主要用于記錄臟塊。

Buffer Cache其實就是磁盤數(shù)據(jù)文件的緩存,以修改塊的操作為例,如update,只是修改Buffer Cache中的Buffer,修改完成后,update操作就算完工了。這樣Buffer中的數(shù)據(jù)和磁盤中的block就不一致了,這樣的Buffer就是臟Buffer,臟塊由DBWR進(jìn)程統(tǒng)一寫磁盤,但是Buffer Cache通常很大,有幾萬或幾十萬Bufeer,怎么在Buffer Cache中找到哪些是臟Buffer呢,這就需要一個鏈表,將所有臟Buffer都串起來,DBWR寫臟塊時,就是按照這個串起來的鏈表的順序來寫,這樣的臟鏈表有兩個,一個是LRUW,另一個是CKPT-Q。在buffer cache中,修改完數(shù)據(jù)后,會將對應(yīng)的數(shù)據(jù)塊加入到檢查點隊列(CKPT-Q)。

LRU鏈表(最近最少使用鏈表)

物理讀時,服務(wù)器進(jìn)程將數(shù)據(jù)塊從數(shù)據(jù)文件讀進(jìn)Buffer Cache中,假如Buffer Cache有10000個Buffer,那么進(jìn)程應(yīng)該覆蓋哪個Buffer呢?

簡單說,就是進(jìn)程將數(shù)據(jù)塊讀進(jìn)Buffer Cache的什么地方。

答案是,覆蓋最不常用的Buffer,LRU主要就是解決如何快速找到最不常用的Buffer。

在Oracle 8i之前,LRU算法是,DB Cache在LRU上是會移動的,常用的緩沖會被換到LRU的熱端,不常用的緩沖會被擠到LRU的冷端,一般來說會話分配Cache時,會從LRU的冷端開始查找。這種LRU算法會產(chǎn)生性能瓶頸。

從 Oracle 8i 開始,LRU 的算法有所改進(jìn),LRU 鏈上的緩沖不再需要移動了,而是通過 tch計數(shù)器大小值來判斷某個數(shù)據(jù)塊是否為熱塊。

(2)Redo Log Buffer

重做日志緩沖區(qū)是SGA中的一個循環(huán)緩沖區(qū),它存儲描述數(shù)據(jù)庫更改的重做條目。

重做記錄是一種數(shù)據(jù)結(jié)構(gòu),它包含重做DML或DDL操作對數(shù)據(jù)庫所做更改所需的信息。數(shù)據(jù)庫恢復(fù)將重做項應(yīng)用于數(shù)據(jù)文件以重構(gòu)丟失的更改。

LGWR按順序?qū)?shù)據(jù)塊寫入磁盤,而DBW將數(shù)據(jù)塊分散寫入磁盤。分散寫比順序?qū)懸枚?。因為LGWR允許用戶避免等待DBW完成緩慢的寫操作,所以數(shù)據(jù)庫提供了更好的性能。

LOG_BUFFER初始化參數(shù)指定Oracle數(shù)據(jù)庫在緩沖重做條目時使用的內(nèi)存量。與其他SGA組件不同,重做日志緩沖區(qū)和固定SGA緩沖區(qū)不會將內(nèi)存分成顆粒。

(3)Shared Pool

相比于Buffer Cache,共享池中的內(nèi)容可謂是雜亂無章。Oracle基本上將不能放進(jìn)Buffer Cache中的數(shù)據(jù)都扔進(jìn)了共享池,使得共享池的分配和釋放極為頻繁。

共享池中最基本的內(nèi)存分配單元成為Chunk,相當(dāng)于Buffer Cache中的Buffer或塊的概念。

Chunk的大小極不統(tǒng)一,最新的Chunk可以只有十來個字節(jié),最大的Chunk有幾十兆甚至幾百兆。基本內(nèi)存單元大小的不統(tǒng)一,再加上頻繁進(jìn)行分配、釋放操作,使共享池中極易產(chǎn)生內(nèi)存碎片??偟膩碚f,共享池是Oracle中最復(fù)雜的內(nèi)存池。

包括以下內(nèi)容:

?Library Cache

?Data Dictionary Cache

?Server Result Cache

?Reserved Pool

1Library Cache

庫緩存主要存儲用戶提交的SQL語句、SQL語句相關(guān)解析數(shù)、SQL執(zhí)行計劃、PL/SQL程序塊等。

2Data Dictionary Cache

dictionary cache里存放了數(shù)據(jù)字典的內(nèi)存結(jié)構(gòu),包括表的定義、Storage信息、用戶權(quán)限信息、約束定義、表的統(tǒng)計信息等。SQL語句解析期間頻繁地訪問數(shù)據(jù)字典。構(gòu)造dictionary cache的目的是為了加快SQL解析過程中語義解析的速度。

數(shù)據(jù)字典緩存也被稱為行緩存(Row Cache),因為它是以記錄行為單元存儲數(shù)據(jù)的,而不像 Buffer Cache 是以數(shù)據(jù)塊為單元存儲數(shù)據(jù)。

3Server Result Cache

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

執(zhí)行查詢時,數(shù)據(jù)庫將確定查詢結(jié)果是否存在于查詢結(jié)果緩存中,如果結(jié)果存在,那么數(shù)據(jù)庫將從緩存中檢索它,而不是執(zhí)行查詢。緩存使數(shù)據(jù)庫能夠避免重新讀取數(shù)據(jù)塊和重新計算結(jié)果的昂貴操作。

4Reserved Pool

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

如果Oracle解析一個PL/SQL程序單元,也需要從共享池中分配內(nèi)存給這些程序單元對象。由于這些對象本一般比較大(如包),所以分配的內(nèi)存空間也相對較大。系統(tǒng)經(jīng)過長時間運行后,共享池可能存在大量內(nèi)存碎片,導(dǎo)致無法滿足對于大塊內(nèi)存段的分配。為了使有足夠空間緩存大程序塊,Oracle 專門從共享池內(nèi)置出一塊區(qū)域來來分配內(nèi)存保持這些大塊。

數(shù)據(jù)庫以塊的形式從共享池分配內(nèi)存。分塊允許將大對象(超過5 KB)加載到緩存中,而不需要單個連續(xù)區(qū)域。通過這種方式,數(shù)據(jù)庫減少了內(nèi)存碎片的產(chǎn)生。

(4)Large Pool

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

大池可以為以下情況提供大內(nèi)存分配:

?用于共享服務(wù)器和Oracle XA接口(用于事務(wù)與多個數(shù)據(jù)庫交互)

?并行執(zhí)行中使用的消息緩沖區(qū)

?用于恢復(fù)管理器(RMAN) I/O從屬的緩沖區(qū)

(5)Java Pool

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

對于專用服務(wù)器連接,Java池包括每個Java類的共享部分,包括方法和只讀內(nèi)存(如代碼向量),但不包括每個會話的Java狀態(tài)。

(6)可選的與性能相關(guān)的SGA子區(qū)域

一些SGA子區(qū)域只針對特定的性能特性啟用。本節(jié)包含以下主題:

?In-Memory Area

?Memoptimize Pool

In-Memory是12C 開始,在 SGA 中新增加的內(nèi)存區(qū)域,可以實現(xiàn)表數(shù)據(jù)按列存儲;

In-Memory 并沒有取代傳統(tǒng)的Buffer Cache ,二者并存在 SGA 中。列式存儲在訪問多行、少列情況下性能更優(yōu)。

memoptimize pool大小通過MEMOPTIMIZE_POOL_SIZE設(shè)置,其中存儲著啟用了fast lookup表的散列索引。

從18c開始支持Memoptimized Rowstore,可用于提高查詢性能。針對頻繁基于主鍵查詢的SQL語句的性能提高十分明顯??梢酝ㄟ^CREATE TABLE或ALTER TABLE…MEMOPTIMIZE FOR READ語句來啟用表的fast lookup。

(7)軟件代碼區(qū)概述

軟件代碼區(qū)是存儲正在運行或可以運行的代碼的內(nèi)存的一部分。Oracle數(shù)據(jù)庫代碼存儲在一個軟件區(qū)域中,這個軟件區(qū)域通常比用戶程序的位置更具排他性和受保護(hù)性。軟件區(qū)域的大小通常是靜態(tài)的,只有在軟件更新或重新安裝時才會改變。這些區(qū)域所需的大小因操作系統(tǒng)而異。

軟件區(qū)域是只讀的,可以安裝共享的,也可以安裝非共享的。有些數(shù)據(jù)庫工具和實用程序(如Oracle Forms和SQL*Plus)可以安裝為共享的,但有些則不能。在可能的情況下,數(shù)據(jù)庫代碼是共享的,這樣所有用戶都可以訪問它,而不需要在內(nèi)存中有多個副本,從而減少了主內(nèi)存,并在總體上提高了性能。如果在同一臺計算機上運行,數(shù)據(jù)庫的多個實例可以將相同的數(shù)據(jù)庫代碼區(qū)域用于不同的數(shù)據(jù)庫。

到此,關(guān)于“Oracle內(nèi)存結(jié)構(gòu)面試題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文名稱:Oracle內(nèi)存結(jié)構(gòu)面試題有哪些
瀏覽地址:http://muchs.cn/article16/pphedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、企業(yè)網(wǎng)站制作、微信公眾號品牌網(wǎng)站設(shè)計、Google搜索引擎優(yōu)化

廣告

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

綿陽服務(wù)器托管