讀書總結(jié):Oracle 軟件結(jié)構(gòu)
2024-08-29 13:47:42
供稿:網(wǎng)友
Oracle數(shù)據(jù)庫服務(wù)器主要由兩個(gè)部分組成:數(shù)據(jù)庫和實(shí)例。
實(shí)例
.實(shí)例的內(nèi)存結(jié)構(gòu):SGA(system global areas)和PGA(PRogram global areas)
.實(shí)例的進(jìn)程結(jié)構(gòu):服務(wù)進(jìn)程和后臺(tái)進(jìn)程
內(nèi)存結(jié)構(gòu):
SGA(system global areas)
1、數(shù)據(jù)庫緩存 db_cach_size
.keep緩存池 buffer_pool_keep
.recycle緩存池 buffer_pool_recycle
.default緩存池 db_cache_size-(buffer_pool_keey+buffer_pool_recycle)
2、重做日志緩存 log_buffer
3、共享池 shared_pool_size
庫緩存:用于緩存已經(jīng)解析并執(zhí)行過的SQL和PL/SQL程序代碼
.享SQL工作區(qū):存放有SQL語句的語法分析結(jié)果和執(zhí)行計(jì)劃。假如共享SQL工作區(qū)已經(jīng)沒有空閑空間,Oracle將利用LRU算法換出最近很少使用過的SQL語句----->SGA
.有SQL工作區(qū):SQL語句的另一部分被保存到私有SQL工作區(qū)中,包括SQL語句中的綁定變量、環(huán)境和會(huì)話參數(shù)等信息,這些信息是屬于執(zhí)行該語句的用戶所私有的,其他用戶即使執(zhí)行相同的SQL語句也不能使用這些信息。只有在共享服務(wù)器(servers=shared)時(shí),私有SQL工作區(qū)才會(huì)在SGA中創(chuàng)建。一般情況下私有SQL工作區(qū)位于PGA中。
#庫緩存的大小與open_cursors密切相關(guān)。open_cursors參數(shù)用于指定數(shù)據(jù)庫中能夠同時(shí)打開的游標(biāo)數(shù)量,每條查詢語句都需要一個(gè)游標(biāo)。
數(shù)據(jù)庫字典緩存:這是一種“行緩存”,即在其中保存的是一條條的記錄,而不像其他緩存那樣保存的是緩存塊。
4、java池
5、大型池 large_pool_size
.進(jìn)行數(shù)據(jù)庫備份和恢復(fù)操作
.執(zhí)行具有大量排序操作的SQL語句
.招待并行化的數(shù)據(jù)庫操作
#假如沒有在SGA區(qū)中創(chuàng)建大型池,上述操作所需的緩存空間將在共享池或PGA中分配。
PGA(program global areas)
保存服務(wù)進(jìn)程的數(shù)據(jù)和控制信息的內(nèi)存結(jié)構(gòu),這個(gè)內(nèi)存結(jié)構(gòu)是非共享的,只有服務(wù)進(jìn)程本身才能夠訪問它自已的PGA區(qū)。每個(gè)服務(wù)進(jìn)程都有它自已的PGA區(qū),各個(gè)服務(wù)進(jìn)程PGA的總和即為實(shí)例的PGA區(qū)的大小。
1、私有SQL工作區(qū)
在執(zhí)行比較復(fù)雜的查詢時(shí)(比如決策支持系統(tǒng)中的查詢語句),經(jīng)常會(huì)需要在PGA中創(chuàng)建一個(gè)比較大的動(dòng)態(tài)緩存區(qū),用來專門執(zhí)行如下一些必須在內(nèi)存中進(jìn)行的操作:
.排序(order by,group by)
sort_area_size
sort_area_retained_size
.連接(inner join )
hash_area_size
.集合運(yùn)算(union,interset,minus)
create_bitmap_area_size
#servers=dedicated
私有SQL工作區(qū)將保存在服務(wù)進(jìn)程的PGA中
#servers=shared
私有SQL工作區(qū)的一部分將保存在SGA區(qū)中
2、會(huì)話內(nèi)存區(qū)
用于保存用戶會(huì)話的變量(登錄信息)以及其他與會(huì)話相關(guān)的信息
#servers=dedicated
會(huì)話內(nèi)存區(qū)將保存在為這個(gè)會(huì)話提供服務(wù)的專用服務(wù)進(jìn)程的PGA中。這時(shí)只有這個(gè)服務(wù)進(jìn)程需要使用該會(huì)話的會(huì)話信息。
#servers=shared
會(huì)話內(nèi)存區(qū)將位于SGA區(qū)中而不是PGA區(qū)中,因?yàn)闀?huì)話信息被所有的共享服務(wù)進(jìn)程使用。
workarea_size_policy=auto
pga_aggregate_target=XXX
進(jìn)程結(jié)構(gòu)
服務(wù)進(jìn)程:
1、專用服務(wù)進(jìn)程:一個(gè)專用服務(wù)進(jìn)程只能為一個(gè)用戶提供服務(wù)
2、共享服務(wù)進(jìn)程:一個(gè)共享服務(wù)進(jìn)程可以為多個(gè)用戶提供服務(wù)
.解析并執(zhí)行用戶所提交的SQL語句。
.在SGA區(qū)的數(shù)據(jù)庫緩存中搜索用戶進(jìn)程所訪問的數(shù)據(jù),假如數(shù)據(jù)不在緩存中,則需要從硬盤數(shù)據(jù)文件中讀取所需的數(shù)據(jù),而將它們復(fù)制到緩存中。
.將數(shù)據(jù)返回給用戶進(jìn)程。
后臺(tái)進(jìn)程
DBWn
db_writer_processes
.當(dāng)用戶執(zhí)行insert或update等操作時(shí),會(huì)首先將插入的數(shù)據(jù)寫入數(shù)據(jù)庫緩存。在這個(gè)過程中,假如Oracle在數(shù)據(jù)庫緩存的LRU列表中搜索了一定數(shù)據(jù)(db_block_max_scan)的緩存塊后,仍然沒有找到可用的空閑緩存塊,DBWR進(jìn)程將啟動(dòng),由DBWR進(jìn)程將臟緩存塊寫入數(shù)據(jù)文件之后,數(shù)據(jù)庫緩存將獲得更多的空閑緩存塊。
.當(dāng)檢查點(diǎn)發(fā)生時(shí),將啟動(dòng)DWBR進(jìn)程
.當(dāng)數(shù)據(jù)庫緩存LRU列表的長度達(dá)到db_block_write_batch指定值的一半時(shí),DBWR進(jìn)程將啟動(dòng)。
.若發(fā)生超時(shí)(大約3秒內(nèi)未被啟動(dòng)),DBWR進(jìn)程被啟動(dòng)。
LGWR
.用戶通過commit語句提交當(dāng)前事務(wù)
.重做日志緩存寫滿三分之一
.DBWR進(jìn)程開始將臟緩存塊寫入數(shù)據(jù)文件
.若發(fā)生超時(shí)(大約3秒),此時(shí)會(huì)啟動(dòng)LGWR
CKPT
log_checkpoint_timeout
log_checkpoint_interval
log_checkpoint_to_alert
SMON
PMON
ARCn
archive_log_start
RECO
Dnnn