天天看點

oracle記憶體結構及注釋

Oracle把資訊存儲在記憶體和磁盤上,磁盤掃描,即實體I/O,與記憶體通路比較起來,一般要花更多的時間。而且實體I/O還會增加CPU資源的請求,如裝置驅動的路徑長度,作業系統event schedulers,是以,在記憶體裡通路資料比從磁盤通路資料更能滿足性能的需要。性能調整的一個目标就是要盡可能的減少實體 I/O的開銷。

是以,适當的設定Oracle各記憶體元件大小和有效的利用他們,可以非常大的提高資料庫的性能(綜合考慮SGA元件大小,PGA元件大小,作業系統需要的記憶體大小,其他程式需要的記憶體大小),Oracle記憶體優化,是一個重複嘗試、觀察的過程。

Oracle使用記憶體來存儲類似如下的資訊:

★程式代碼。

★連接配接的會話資訊,即使目前這個會話不活躍了。

★程式執行過程中需要的資訊(例如,一個查詢目前從第幾行取值的狀态)。

★oracle程序間共享和通訊的資訊(例如,鎖資訊)。

★永久存儲在記憶體裡的緩存資料(例如資料塊,日志條目)。

Oracle的記憶體結構主要包括兩大類,即SGA和PGA,還有一類記憶體結構,叫UGA。

1.1SGA

1.1.1SGA概述

SGA是System Global Area的縮寫。

1.1.1.1SGA定義

一個Oracle instance的SGA,由包含資料和控制資訊的一組共享記憶體結構組成。如果有多個使用者同時連接配接到該instance,那麼SGA裡的資料對這些使用者來說,都是共享的,是以,SGA也有時候也叫Shared global area。

(一個Oracle instance由1個SGA和oracle程序組成,每個instance有自己獨立的一個SGA)

1.1.1.2SGA公共特性

◆當啟動instance時,Oracle自動為SGA配置設定記憶體;當shutdown instance時,作業系統自動回收配置設定給SGA的記憶體。

◆SGA被所有的server和background程序共享。SGA是可讀/寫的。連接配接到多程序資料庫instance的所有使用者,都可以讀取在SGA裡的資訊。

◆如果Oracle部署為shared server結構,那麼一些查詢的請求和響應資訊以及PGA的一些其他資訊就會放入SGA裡。

◆為了性能更好,在大多數系統裡,SGA的全部大小都應該在實體記憶體裡。否則,如果有虛拟記憶體用來存儲SGA的一部分,因為這部分SGA會被作業系統paged(讀寫到磁盤),整個資料庫的系統性能就會明顯的下降,SGA裡所有的共享區域的性能都會受到影響。所有性能下降時,也要檢查系統的swap是否正常。可以使用LOCK_SGA參數把SGA鎖定在實體記憶體裡。

◆SGA的大小,由一些初始化參數的的大小來決定,最能影響SGA大小的初始化參數是:DB_CACHE_SIZE、LOG_BUFFER、SHARED_POOL_SIZE、LARGE_POOL_SIZE。

◆SGA的大小,使用sqlplus啟動instance時會顯示出來,或在sqlplus裡使用SHOW SGA指令即可顯示出來。

◆oracle可以在預設SGA配置下啟動,并且允許通過增加SGA元件的記憶體大小來增加SGA的大小,整個SGA可以使用的最大值受SGA_MAX_SIZE初始化參數的限制。如果在啟動instance初始化記憶體的時候,設定的SGA_MAX_SIZE參數比SGA元件的記憶體之和要小,或者使用SGA_MAX_SIZE的預設設定,那麼在instance啟動後,SGA_MAX_SIZE會被設為sga元件值之和,原值被覆寫。

(zero_plus:

1.show parameter 看見的是目前生效的值,即memory級别的parameter;

2.sga_target和sga中其他參數的關系:10g增加了sga_target參數,如果該參數為0,則必須制定db_cache_size等參數的值;如果該參數不為0,則如果db_cache_size為0,db啟動時根據sga_target和SGA_MAX_SIZE的值配置設定sga的各個元件,如果db_cache_size不為0,則配置設定不小于該值的cache大小,其他sga元件同理。

3. db_cache_size的擴大和縮小,當擴大時立即生效;縮小時不立即生效,在sga_target的值變小時,适量縮小。

4.如果sga_target被改為0,則關閉資料庫時目前的sga各元件的大小會被寫入spfile中。

5.如果sga_target被改為非0,在不重新開機的情況下生效嗎?

1.1.1.3SGA組成部分

SGA邏輯分為3大塊:Fixed SGA、Static SGA、Dynamic SGA,分别描述如下。

1.1.1.1.1Fixed SGA

做為SGA的一部分,所有background程序都需要通路它,有關database和instance的正常狀态資訊,包括程序間的通訊資訊,例如鎖資訊,就組成了Fixed SGA。Fixed SGA裡不包含任何使用者資料,啟動資料庫後,Fixed SGA的大小就固定不變了。

1.1.1.1.2Static SGA 

即需要重新啟動資料庫才生效,包括Redo log buffer、Java pool。

1.1.1.1.3Dynamic SGA

不需要執行shutdown instance就可以更改的SGA記憶體區域。Dynamic SGA包括:Database buffer cache、Shared pool、Large pool(optional)這幾個記憶體組成部分。

(zero_plus:show sga顯示的Variable Size是指哪一部分:共享池+LARGE池+java池(除db_cache和log­_buffer外的sga區域)+空閑sga)

Dynamic SGA的可設定大小受虛拟記憶體大小的限制。Dynamic SGA提供了從外部控制(增加或減少)Oracle使用記憶體的方法,它允許DBA釋出語句增加或縮小SGA到作業系統允許的最大值和SGA_MAX_SIZE的指定值,或縮小到Oracle規定的最小值。同時,也會根據一些内部的Oracle管理政策,在運作時,SGA記憶體元件的大小自動增加或縮小。

1.1.1.1.3.1granule

Dynamic SGA的所有記憶體元件與實體記憶體之間配置設定或釋放的最小機關叫granule(static記憶體java pool也使用granule為機關配置設定或釋放記憶體),Dynamic SGA的元件都是granule的整數倍。有關granule的所有資訊,都存儲在一個相應的granule entry裡,Oracle在這個granule entry裡維護所有的granule狀态。

Granule的大小由總SGA的大小決定,對于大多數系統來說,如果總的SGA大小小于128M,那麼granule是4M,否則為16M。但也受一些作業系統的影響,比如32-bit的Windows NT,如果總的SGA大于128M,則granule是8M。可以檢視V$SGA_DYNAMIC_COMPONENTS視圖檢視目前正在使用的granule大小,所有的Dynamic SGA元件都使用同樣大小的granule為配置設定和釋放機關。(如果的Dynamic SGA元件的大小不為granule的整數倍,則Oracle自動把元件大小設定=“(原設定大小%granule+1)*granule” )

(我的IBM筆記本,fedora core5,oracle 10g,SGA總大小超過160M,但granule還是為4M,很奇怪。在SUN 64-bit上,SGA大于2G,granlue是16M)

Oracle使用一個scoreboard來分别記錄這些Dynamic SGA元件和這些元件的granules的相關資訊,對于每個Dynamic SGA元件自己的granules,scoreboard包含了配置設定給該元件的granule個數,要擴充的granules大小,所有的這些資訊,從oracle instance啟動開始就進行了記錄。對于每個Dynamic SGA元件,Oracle維護granules的初始個數以及最大個數,Oracle對于改變的granule個數,同時在scoreboard進行了記錄,記錄了這個操作,改變的大小,和開始改變的時間,Oracle在coreboard裡逐漸更新這些過程,直到該修改操作完成。當修改完成後,Oracle使用修改的目的大小來替換目前大小,并且清除掉target size field和progress field,Oracle會更新初始化參數值以反映被更新的SGA大小,這個操作結束後,DBA就可以檢視到有多少granule被修改了。Oracle維護一個circular buffer來記錄最後100次對scoreboard的操作,v$sga_dynamic_components就可以看到這些内容。

在啟動instance時,Oracle讀取初始化參數檔案的Dynamic SGA相關設定大小,查詢作業系統記憶體限制,并且為這些SGA元件配置設定虛拟位址空間。SGA_MAX_SIZE如果不被忽略,那麼該參數就指定了在整個instance活躍期SGA可以使用的最大值了,機關是bytes。

DBA可以使用ALTER SYSTEM語句來更改初始化參數檔案裡的Dynamic SGA元件的大小,Oracle接收到要改變的大小值(target size),并且會把該元件大小逐漸擴增或縮小到最近的一個granule的整數倍,最後修改到指定的target size。但Oracle必須有足夠free granule來滿足請求,如果目前SGA大小小于SGA_MAX_SIZE大小,那麼Oracle可以配置設定更多的granules直到SGA大小達到SGA_MAX_SIZE。(這些變化都可以在v$sga_dynamic_components視圖裡看到)

注意,java pool雖然是靜态參數,但他的記憶體配置設定規則,也是按照granule為機關配置設定的。

(zero_plus:java_pool在10g中是動态的,在9i中是靜态的)

1.1.1.1.4其他一些SGA控制參數

LOCK_SGA參數,指定把SGA鎖定在實體記憶體裡。

SHARED_MEMORY_ADDRESS和HI_SHARED_MEMORY_ADDRESS參數,同時使用某一個,來指定SGA的記憶體運作開始位址,通常不使用這兩個參數(預設為0),而使用作業系統設定的開始位置。

USE_INDIRECT_DATA_BUFFER,可以讓SGA在32-bit的平台使用超過4G的實體記憶體,但由于每個buffer都要求有一個有效的虛拟位址,是以在目前版本該參數無效。

1.1.1.1.5Database Buffer Cache活動統計值

一般可檢視V$DB_CACHE_ADVICE和[a1] Buffer cache hit ratio[a2] 來觀察Database Buffer Cache的活動情況。

1.1.2Database Buffer Cache

Database Buffer Cache儲存了從datafile拷貝來的data blocks。所有目前連接配接到instance的使用者程序都可以共享通路database buffer cache。

要想有效的利用database buffer cache,應用程式的SQL語句就應該被優化以減少不必要的資源消耗,通常,經常執行的SQL語句和發生大量buffer gets的SQL語句應該被優化。

database buffer cache和shared SQL cache被邏輯地組織為segments放入multiple sets,在多處理器系統,這樣可以減少系統競争。(zero_plus:此segment跟表的segment對應嗎?)

1.1.2.1組織結構

database buffer cache裡的buffer,被組織到兩個list裡:write list和least recently used list(簡稱為LRU)。一個buffer對應一個db_block_size大小。

◆Write list:

儲存的是dirty buffers,是已經被修改了但還沒有寫進磁盤的資料。

◆LRU list:

儲存的是free buffers,pinned buffers,和還沒有被移到write list的dirty buffers。

free buffers還沒有包含任何有用的資料,可以被用來存儲從datafile拷貝來的資料。

pinned buffers是目前正在被通路的buffers。

1.1.2.2工作原理

當一個oracle user process需要通路data的particular piece時,oracle user process先通過mutiple sets裡的段結構在cache裡搜尋buffer,如果發現data已經在cache裡了(也就是發生一次cache hit),該程序會把這個buffer移到LRU的頭部(即使用most recently used — MRU的方法),同樣地,相關的更多的buffer會繼續移到LRU的頭部,相對地,dirty bufers在LRU的位置就會向LRU list的尾部移動,減少在cache裡的壽命,然後就可以立即從記憶體裡讀到資料;如果在cache裡找不到data(也就是發生一次cache miss),那麼在通路這個資料前,它必須先從磁盤上的datafile把需要通路的data block拷貝到cache裡的free buffer裡,然後再通路。是以cache hit比cache miss通路要快。

如果是cache miss,那麼在從磁盤上拷貝data block前,user process會先在LRU list裡搜尋free buffers來存放将從磁盤上的datafile 拷貝的data block。user process從LRU list的尾部開始搜尋,直到找到一個free buffer或直到搜尋到buffers的門限值。在搜尋的過程中,如果user process發現一個dirty buffer,它會把這個dirty buffer移到write list,然後繼續搜尋。如果找到了free buffer,那麼它會從磁盤讀取data block到這個搜到的free buffer裡,然後把這個被寫入資料的buffer移到LRU list的頭部。如果搜到buffer的門限值都還沒找到free buffer,user process會停止搜尋,并且發一個信号給DBW0背景程序來把write list裡的dirty buffer寫到磁盤上,以得到free buffer。

但是特殊地,對于全表掃描,從table裡讀出放入到buffer的資料,由于全表掃描通常僅僅是很少發生,這些buffer會被放到LRU list的尾部,以讓這些包含全表掃描資料的buffer更快的離開經常需要通路的buffer。但你可以控制這種算法,通過對table或cluster在create或alter的時候指定cache子句,那麼全表掃描時,這些buffer就會放到LRU list的頭部了。

1.1.2.3大小設定

Database buffer cache的設定,是與database block size的設定相對應的。

一般優化一個instance時,知道正确的buffer cache大小是很重要的,典型的做法是,在開始時估計一個buffer cache大小值,然後運作一些具有代表性的程式,并且測試、觀察相關統計資料,來判斷估計值比優化值小還是大,逐漸調整,最終優化。

Oracle支援多種Database block size的大小,有效範圍從2K到32K(由參數db_block_size設定),system表空間的block size是資料庫block的預設大小,db_block_size參數設定的是标準大小。

有标準和非标準block size,與之對應的,由db_cache_size參數來設定标準的database buffer cache來與标準的block size對應。非标準的block size由DB_nK_CACHE_SIZE[a3] 參數來與之對應。(會有一些作業系統平台限制最大塊的大小,是以一些db_block_size的大小在2K到32K的範圍裡是受到限制的)(zero_plus:如何使用非标準塊)

db_cache_size永遠與标準block size相對應,與此同時,不再允許設定與标準塊大小一樣的DB_nK_CACHE_SIZE參數。

V$BUFFER_POOL可以檢視這些變化。

1.1.2.4使用多種buffer pool

可以把database buffer cache配置成多個獨立的buffer pool,比如可以一直把data儲存在buffer cache--keep buffer pool,可以讓新資料一來立即就可獲得free buffer—recycle buffer pool。database buffer cache預設隻使用一個pool,即default buffer pool。(可檢視user_segments視圖知道schema object對應的是那個buffer pool,預設是default pool)。

标準block size可以配置最多3個buffer pool,即keep,default,recycle,3個buffer pool,至少配置一個default buffer pool,而非标準的block size,隻允許配置一個default pool。

KEEP BUFFER POOL[a4] :

把schema object’s data blocks儲存在記憶體裡。設定參數DB_KEEP_CACHE_SIZE,是dynamic sga參數。(zero_plus:這個參數是幹嘛的--buffer_pool_keep—8i)

RECYCLE BUFFER POOL:

一旦不需要通路的data blocks,就會被從記憶體裡清除掉。設定參數DB_RECYCLE_CACHE_SIZE,是dynamic sga參數。(zero_plus:這個參數是幹嘛的--buffer_pool_recycle)

DEFAULT BUFFER POOL:

儲存的是沒有與keep,recycle關聯的schema objects’data blocks,對象一般都是明确指定是default的。DB_CACHE_SIZE或DB_nK_CACHE_SIZE參數。

1.1.3Redo Log Buffer

組織結構:

Redo log buffer包含了有關對資料庫的更改的資訊,是一個circular buffer。

這些資訊都存儲在redo entries裡。

redo entries包含資料庫被INSERT,UPDATE,DELETE,CREATE,ALTER,DROP操作修改了的資料庫重構、重做的必要資訊。在資料庫恢複時它們就很有用了。

工作原理:

由oracle server process從SGA裡的user’s memory space拷貝到redo log buffer,redo entries是log buffer裡連續的空間,再由LGWR背景程序把redo log buffer[a5] 寫到活動的online redo log file(or group of files)裡。

大小設定:

LOG_BUFFER參數設定redo log buffer的大小,對于一些長事務或事務很多的系統,log buffer一般設大一點,預設值一般根據CPU_COUNT來決定,(不是512K就是128K)*CPU_COUNT。

(zero_plus:參數db_block_buffers何用)

1.1.4Shared Pool

Shared pool包含3個主要區域:library cache、dictionary cache、并行執行的消息buffer和控制結構。

1.1.4.1組織結構和工作原理

■Library cache:

Library cache包括如下區域:

★Shared SQL areas:所有使用者都可以通路。在shared SQL area裡,儲存一個SQL語句的parse tree和execution plan。當一個新的SQL語句被解析時,oracle從shared pool裡配置設定記憶體,存儲為shared SQL area,配置設定的記憶體大小依賴于SQL語句的複雜程度,如果所有的sahred pool都被配置設定完了,那麼Oracle會使用LRU的方法清除一些記憶體項,直到有足夠的空間來配置設定給新SQL語句的shared SQL area。如果Oracle清除了一個shared SQL area,那麼在這個SQL下次執行時,必須被重新解析和關聯到其他的shared SQL area。(zero_plus:确定共享級别的參數是哪個[a6] )

★Private SQL areas(多事務系統):這部分屬于PGA了。

★PL/SQL procedures and packages:Oracle process的PL/SQL程式是以procedures,functions,packages,anonymous blocks,triggers為機關的。對于一個PL/SQL程式,Oracle配置設定一塊shared area來儲存它的parsed,compiled form,配置設定一塊private area來儲存執行該PL/SQL程式的會話所指定的值,包括local,global和package變量(如package執行個體)和執行SQL語句的buffers。如果同時有多個使用者執行同一個PL/SQL程式,那麼該PL/SQL程式隻有一個shared area供大家共享,但每個使用者有自己獨立的一個private area拷貝來儲存自己會話私有的資訊。而對于process PL/SQL程式來說,它們都是process SQL語句,忽略這些SQL語句屬于那個PL/SQL程式,它們都有自己的shared SQL area和private SQL area。

★Control structures(例如locks,library cache handles)

Oracle通過一個shared SQL area和一個private SQL area來描述每條它運作的SQL語句[a7] ,當多個使用者同時執行相同的SQL語句時,他們共享該SQL的shared SQL area,但每個使用者都單獨有一個shared SQL area的拷貝,即獨立的private SQL area。

■Dictionary cache:

資料字典是一組資料庫表和視圖,他們包含了有關資料庫的結構,使用者等的相關資訊。在SQL語句解析時會頻繁的通路資料字典,操作資料庫必不可少的要通路資料字典。

由于資料字典被oracle經常通路,是以在記憶體裡有兩個專有的存儲單元被指定用來儲存字典資料。一個存儲單元叫做data dictionary cache,和row cache(以rows的方式代替使用bffuer(buffer儲存資料是儲存資料的全部blocks)方式來儲存資料)一樣的管理方式,另外一個儲存字典資料的區域是library cache。所有的oracle使用者程序通路資料字典資訊時都共享這兩個cache。

■Parallel execution messages buffers and control structures:

通常情況下,任何shared pool的item(即shared SQL area or dictionary row)都會被保留,直到他們依據LRU方法被flushed掉。當有新的item需要從shared pool裡配置設定空間時,那些空閑的記憶體并不是被有規則的配置設定給item的。隻要它們有用,LRU方法會一直讓那些被很多會話使用的shred pool items保留在記憶體裡,即使建立這個items的原始程序已經terminates。因為這樣,一個多使用者的資料庫系統的總體開銷和SQL相關的開銷才會最小化。

當一個SQL語句被送出給oracle執行時,Oracle會自動完成下列配置設定記憶體的步驟:

1,Oracle檢查shared pool看是否有一個相同SQL語句的shared SQL area已經存在了,如果存在,那麼這個shared SQL area就會被用來執行,否則,Oracle配置設定一個新的shared SQL area來保持該SQL語句的parse tree和execution plan。以上兩種情況,user’s private SQL area都會被associated到包含該SQL語句的shared SQL area。

Shared SQL area可以被從shared pool裡flushed掉,即使該shared SQL area對應的是一個打開的但有一段時間沒有被使用的cursor。當該打開的cursor後來被用來執行所對應的[a8] SQL語句時,Oracle會重新解析該SQL語句,這個SQL語句的shared SQL area會在shared pool裡重新配置設定。

2,Oracle會配置設定一個private SQL area來代表一個獨立的會話的執行,private SQL area的配置設定位置,即在什麼SGA元件裡配置設定,依賴于會話連接配接的類型[a9] 

在以下幾種情況,Oracle也會從嗯shared pool裡flushed shared SQL area:

◇當釋出ANALYZE分析語句來更新或删除table,cluster,index的統計資料時,shared pool裡所有的shared SQL area,如果包含的語句與該被分析schema object相關,則會被flushed掉,下一步,一條flushed語句會被運作,被删除的shared SQL area裡的語句會被重新解析,并且放入到新的shared SQL area裡以反應新的shcema object統計資料。

◇如果一個schema object被任何形式的修改後,在shared pool裡與之相關的任何shread SQL area都會被标記為無效,在下次執行時,都會被要求重新解析。

◇如果修改了global database name[a10] ,那麼shared pool裡所有的資訊都會被flushed掉。

◇通過ALTER SYSTEM FLUSH SHARED_POOL;語句,DBA可以手工從shared pool裡flushed所有資訊。

1.1.4.2大小設定

Shared pool的總體大小由參數SHARED_POOL_SIZE來設定,預設下,32-bit系統為32M,64-bit系統為64M.

1.1.5Large Pool[a11] 

DBA可以配置一個optional memory area,即large pool來為下列工作提供large memory:

■Shared server的會話記憶體,和Oracle XA接口(即超過一個資料庫裡的事務之間的關系)

■I/O服務程序

■Oracle備份和恢複操作

■并行執行的消息buffer(如果PARALLEL_AUTOMATIC_TUNING=true,如果是false,那麼該記憶體會在shared pool裡配置設定)

通過配置large pool,Oracle的shared pool可以隻要緩存shared SQL和避免縮小shared SQL cache的性能開銷。

一般,給Oracle備份和恢複,I/O服務程序,并行buffer配置設定的記憶體有幾百K,large pool比shared pool更能滿足這些記憶體請求。

Large pool沒有LRU list,這和shared pool不一樣。shared pool裡所有的記憶體配置設定,都使用同一個LRU list。

1.2PGA

PGA是Program Global Area的縮寫,是一個包含server process的資料和控制資訊的記憶體區域,它是非共享的,即每個server或background程序,都有一個自己的PGA,在server process啟動時由Oracle建立,它的讀寫都隻由server process自己完成,一般包括Stack ares、Data areas等記憶體區域。

PGA的組成部分,依賴于instance是否運作在shared server option,但通常說的PGA,包括如下部分:Private SQL Aara和Session Memory、SQL Work areas。

DBA可以簡單的,隻需要設定PGA_AGGREGATE_TARGET參數來指定PGA的總大小即可,這樣PGA的各記憶體子產品大小就會被Oracle自動和全局管理了。(WORKAREA_SIZE_POLICY參數值預設為auto,也隻有在auto時PGA_AGGREGATE_TARGET對*_AREA_SIZE的配置設定管理才生效)

1.2.1Private SQL Area

一個private SQL area包含了例如邦定資訊和運作時記憶體結構等資料。每個釋出SQL語句的會話都有一個private SQL area。如果同時有多個會話,即使釋出相同的SQL語句,他們也有自己的private SQL area,同時共享一個shared SQL area。

在一個private SQL area的生命期裡,它被劃分為兩個區域:

◆永久區域:包含了如邦定資訊,隻有在private SQL area的cursor關閉時才會釋放[a12] 。

◆運作時區域:在cursor的SQL語句執行結束後,即釋放。

第一步是建立運作時區域,對于INSERT,UPDATE和DELETE語句,在語句執行結束後即釋放運作時區域,對于查詢語句,隻有在所有行被fetch或查詢取消後才會釋放運作時區域。

Private SQL area在什麼記憶體子產品配置設定,取決于連接配接的會話是什麼類型,如果是dedicated server,那麼private SQL area在server process’PGA。如果是shared server,那麼private SQL area在SGA裡配置設定。

1.2.1.1cursor和SQL Areas

Oracle預編譯程式(比如PL/SQL程式)或OCI程式會顯式打開的cursor,或handles,會來指定一個private SQL areas,這些程式執行時,會把他們做為一個命名資源來使用。為一些SQL語句而執行的Oracle遞歸操作隐式打開的cursor,也使用shared[a13]  SQL areas。

Private SQL areas是由user process管理的。配置設定和回收private SQL areas很大程度依賴于你使用的是什麼應用程式工具,user process能配置設定的private SQL areas的個數由OPEN_CURSORS指定,預設值是50。

整個private SQL area(主要是永久區域)直到cursor關閉或SQL句柄釋放才會釋放,應用程式關閉那些将不再被使用的cursors來釋放private SQL area以及減少應用程式使用者請求的記憶體大小。

注釋:cursor就是private SQL area的一個句柄或名字。

1.2.2Session Memory

Session memory是配置設定來儲存會話變量(即登入資訊)和其他一些與會話相關的資訊的記憶體區域。如果是shared server模式,session memory是共享的,而不是private的。(zero_plus[a14] :雖然是共享的,但任然儲存在pga中)

1.2.3SQL Work areas

一些複雜的查詢(比如descision-support queries),private SQL area的運作時區域會有一個大的部分被獨立成SQL work areas,由如下memory-intensive操作來配置設定:

★排序操作(order by,group by,rollup,window function)

★hash連接配接

★bitmap merge[a15] 

★bitmap create[a16] 

例如,排序操作使用SQL work area(一些時候被叫做sort area)來完成記憶體排序。hash-join操作使用SQL work area(也叫做hash area)來完成把從左邊輸入的資料建立成一個hash table。如果要sort的資料或建立hash table的資料太大,裝不進SQL work area,那麼這些資料會被分為一些小的pieces,這樣就可以讓一些data pieces在記憶體裡操作,其他data pieces暫時被存入temp表空間,稍後被取到記憶體進行sort或hash操作。

但是bitmap操作不一樣,如果SQL work area相對太小,他們不會被分成pieces暫時存入temp表空間,他們相反的,會複雜的調整到适合SQL work area大小來執行bitmap操作。

是以,sort,hash,bitmap可以更快的在large SQL work area裡執行。

SQL work area的大小可以控制和調整。通常,較大的SQL work areas可以明顯的改善性能,特别是SQL work area對于輸入資料來說足夠大時,和一些輔助性的記憶體結構被相關操作配置設定後,性能提高就很明顯,否則,由于一部分輸入資料要被臨時寫入temp表空間,導緻在SQL work area裡的操作響應時間就要增加了。極端情況下,比如SQL work areas對于輸入資料來說很小很小,那麼輸入資料就會被劃分成很多個pieces,這時就會非常明顯的增大SQL work areas裡操作的響應時間了。

在早期的版本裡,DBA通過設定如下參數來控制SQL work area的大小:

SORT_AREA_SIZE,HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE。

但設定這些參數是比較困難的,因為這4種操作裡,針對每一類裡的每次操作,要完美的設定好大小和SQL work area的個數就很困難,這時就很難設定這些*_AERE_SIZE的大小。

而通過PGA_AGGREGATE_TARGET參數設定PGA大小,在dedicated sessions,work areas都是自動配置設定的,4個*_AREA_SIZE參數會被忽略,任何時刻,可以配置設定給SQL work areas的PGA大小都自動由PGA_AGGREGATE_TARGET參數值配置設定得到。可以配置設定的大小是PGA_AGGREGATE_TARGET參數值減去已經使用了的和。

注意:

1)預設值為auto的WORKAREA_SIZE_POLICY參數是會話和系統級的,當設定了PGA_AGGREGATE_TARGET和*_AREA_SIZE後,可以在系統級和會話級把WORKAREA_SIZE_POLICY修改為manual值,進而使用*_AREA_SIZE參數來配置設定*_AREA_SIZE參數指定的記憶體大小,這些大小不再從PGA_AGGREGATE_TARGET裡配置設定。

2)在shared server,work ares的大小不是PGA_AGGREGATE_TARGET參數配置設定了,因為在shared server,work areas将在SGA裡配置設定。所有在shared server,work area仍然是由*_area_size參數控制。

3)一些時,work areas在一些書上會叫做process-private memory。

1.3UGA

1.4Software Code Areas

Software code area是用來存儲Oracle軟體code的記憶體區域,存儲的是正在運作的code或将運作的code。code area根據應用程式存儲在不同的區域-獨占區域,保護區域。其大小一般是靜态大小,隻有在軟體更新或重新安裝後其需要的大小才會改變,需要的大小由作業系統來更改。

Software areas是隻讀的,可以被安裝成共享和非共享,隻要可能,都是共享的,以讓所有的使用者通路而不需要在記憶體裡使用多個拷貝,這樣可以減少實體記憶體使用和提高性能。如一些如SQL*Plus和SQL*Forms等Oracle tools和utilities可以共享,但一些不能共享。當在同一個機器上運作多個多個instances操作多個database時,相同的oracle code就可以共享。

注意:并不是所有作業系統都支援oracle code共享的,如windows pc就不支援。

1.5參考資訊

1.5.1相關視圖彙總

1.5.1.1SGA參考試圖

1.1.1.1.6V$SGA_DYNAMIC_COMPONENTS

1.1.1.1.7V$SGA_CURRENT_RESIZE_OPS

1.1.1.1.8V$SGA_RESIZE_OPS

1.1.1.1.9V$SGA_DYNAMIC_FREE_MEMORY

1.1.1.1.10V$BUFFER_POOL

1.5.1.2PGA參考視圖

1.1.1.1.11V$SYSSTAT

1.1.1.1.12V$SESSTAT

1.1.1.1.13V$PGASTAT

1.1.1.1.14V$SQL_WORKAREA

1.1.1.1.15V$SQL_WORKAREA_ACTIVE

1.1.1.1.16V$PROCESS

1.5.2相關初始化參數彙總

1.5.2.1SGA_MAX_SIZE

1.5.2.2LOCK_SGA

1.5.2.3SHARED_MEMORY_ADDRESS

1.5.2.4HI_SHARED_MEMORY_ADDRESS

1.5.2.5USE_INDIRECT_DATA_BUFFER

1.5.2.6DB_BLOCK_SIZE

1.5.2.7DB_CACHE_SIZE

1.5.2.8DB_nk_CACHE_SIZE

1.5.2.9DB_KEEP_CACHE_SIZE

1.5.2.10DB_RECYCLE_CACHE_SIZE

1.5.2.11LOG_BUFFER

1.5.2.12CPU_COUNT

1.5.2.13SHARED_POOL_SIZE

1.5.2.14PARALLEL_AUTOMATIC_TUNING

1.5.2.15PGA_AGGREGATE_TARGET

1.5.2.16WORKAREA_SIZE_POLICY

1.5.2.17SORT_AREA_SIZE

1.5.2.18HASH_AREA_SIZE

1.5.2.19BITMAP_MERGE_AREA_SIZE

1.5.2.20CREATE_BITMAP_AREA_SIZE

1.5.2.21OPEN_CURSORS

 [a1]Zero_plus:該視圖怎麼用?

 [a2]怎麼檢視?

 [a3]如何使用非标準塊

 [a4]怎麼把對象放到keep和recycle池中

 [a5]COMMIT 或 ckpt時

 [a6]cursor_sharing它必須來自 SIMILAR, EXACT, FORCE 之間,此三個值的含義?

 [a7]Shared sql area儲存執行計劃,private sql area儲存變量或完整的sql語句

 [a8]說明遊标是private sql area中的一條sql語句,它的執行計劃在shared sql 中。是以open_cursors應該是在一個會話中最大的打開遊标數。

 [a9]如果是共享會話它在sga中,如果是獨享會話它在PGA中

 [a10]是監聽器裡的嗎

 [a11]Large池沒有lru list,運作機制與共享池不一樣,是以在Oracle備份和恢複,I/O服務程序,并行buffer時large應該被用來代替共享池

 [a12]是以一定要關遊标

 [a13]應該是private吧

 [a14]應該是吧

 [a15]Merge沒有最優、一遍、多遍之說。

 [a16]什麼是産生