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