oracle體系結構總結

luoleiAaron發表於2014-03-08
一、oracle資料庫的整體架構,oracle資料庫由例項和資料庫組成。

二、資料庫儲存結構


oracle資料庫有物理結構和邏輯結構。資料庫的物理結構是資料庫中作業系統檔案的集合。資料庫的物理結構由資料檔案、控制檔案和重做日誌檔案組成
       資料檔案:資料檔案是資料的儲存倉庫。
        聯機重做日誌檔案:聯機重做日誌檔案包含對資料庫所做的更改記錄,在發生故障時能夠恢復資料。
重做日誌按時間順序儲存應用於資料庫的一連串的變更向量。其中僅包含重建(重做)所有已完成工作的最少限度資訊。如果資料檔案受損,則可以將這些變更向量應用於資料檔案備份來重做工作,將它恢復到發生故障的那一刻前的狀態。重做日誌檔案包含聯機重做日誌檔案(對於連續的資料庫操作時必須的)和歸檔日誌檔案(對於資料庫操作是可選的,但對於時間點恢復是必須的)。
        歸檔重做日誌檔案:當重做日誌檔案滿時將重做日誌檔案進行歸檔以便還原資料檔案備份。   

     檔案:控制檔案包含維護和驗證資料庫完整性的必要的資訊。控制檔案雖小,但作用非常大。它包含指向資料庫其餘部分的指標:聯機重做日誌檔案和資料檔案的位置,以及更新的歸檔日誌檔案的位置。它還儲存著維護資料庫完整性所需的資訊。控制檔案不過數MB,卻起著至關重要的作用。

除了三個必須的檔案外資料庫還能有其它非必須的檔案如:引數檔案、口令檔案及歸檔日誌檔案。

     例項引數檔案:當啟動oracle例項時,SGA結構會根據此引數檔案的設定內建到記憶體,後臺程式會據此啟動。

     口令檔案:使用者通過提交使用者名稱和口令來建立會話。Oracle根據儲存在資料字典的使用者定義對使用者名稱和口令進行驗證。

、例項的整體架構

    

      例項由記憶體和後臺程式組成,它暫時存在於RAM和CPU中。當關閉執行的例項時,例項將隨即消失。資料庫由磁碟上的物理檔案組成,不管在執行狀態還是停止狀態,這些檔案就一直存在。因此,例項的生命週期就是其在記憶體中存在的時間,可以啟動和停止。一旦建立資料庫,資料庫將永久存在。通俗的講資料庫就相當於平時安裝某個程式所生成的安裝目錄,而例項就是執行某個程式時所需要的程式及消耗的記憶體。

Oracle的記憶體架構包含兩部分系統全域性區(SGA)和程式全域性區(PGA)。

3.1程式全域性區

3.2系統全域性區

在作業系統提供的共享記憶體段實現的記憶體結構稱為系統全域性區(SGA)。SGA在例項啟動時分配,在關閉時釋放。在一定範圍內,可以在例項執行時通過自動方式或響應DBA的指令,重新調整11g例項中的SGA及其中的元件的大小。


由上圖可知SGA至少包含三種資料結構:資料庫緩衝區快取、日誌緩衝區及共享池。還可能包括:大池、JAVA池。可以使用show sga,檢視sga的狀態。

3.2.1共享池
   共享池由許多子結構組成,這些子結構由oracle伺服器內部自動管理。在共享池的總體大小範圍內,各個結構的大小將因針對例項的活動模式而異。共享池本身的大小可以動態重調。
    a.庫快取是記憶體區域,按其已分析的格式儲存最近執行的程式碼。分析就是將程式設計人員編寫的程式碼轉換為可執行的程式碼,這是oracle根據需要執行的一個過程。通過將程式碼快取在共享池,可以在不重新分析的情況下重用,極大地提高效能。
    b.資料字典快取有時稱為“行快取”,它儲存最近使用的物件定義:表、索引、使用者和其他後設資料定義的描述。通過將此類定義放在SGA的記憶體中,以便使所有會話可以直接訪問它們,而不是被迫從磁碟上的資料字典中重複讀取它們,從而提高分析效能。
    c.PL/SQL區:儲存的PL/SQL物件是過程、函式、打包的過程、打包的函式、物件型別定義和觸發器。它們全都像原始碼那樣儲存在資料字典中,也使用已編譯的格式。當會話呼叫儲存的PL/SQL物件時,它必須從資料字典讀取。為了避免重複讀取,將物件快取到共享池的PL/SQL區。
  共享池的大小對效能產生重要影響,它應該足夠大,以便快取所有頻繁執行的程式碼和頻繁訪問的物件定義,但也不能過大,以至於連僅執行一次的語句也要快取。如果共享池過小,則效能下降,因為伺服器會話將反覆搶奪其中的空間來分析語句,此後,這些語句會被其他語句重寫,在重新執行時,將不得不再次分析。過大的共享池也會對效能產生不良影響,因為搜尋需要的時間過長。如果共享池小於最優容量,則效能將下降。但有一個最小容量,如果低於此限度,則語句將失敗。確定最優容量是一個效能調整問題,大多數資料庫都需要一個數百MB的共享池。有些應用程式需要1GB以上的共享池,但很少有應用程式能夠在共享池小於100 MB時充分執行。
       共享池在例項啟動時分配。從9i開始,可以隨時將其調大或調小。可以採用手動方式重調,也可以根據工作負荷自動調整大小。
手動調整共享池的大小:
select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components;//顯示可以動態重設大小的SGA元件的當前、最大和最小容量
SQL> select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components;
COMPONENT                                                        CURRENT_SIZE   MIN_SIZE   MAX_SIZE
---------------------------------------------------------------- ------------ ---------- ----------
shared pool                                                         104857600  100663296          0
large pool                                                            4194304    4194304          0
java pool                                                             4194304    4194304          0
streams pool                                                                0          0          0
DEFAULT buffer cache                                                167772160  167772160          0
KEEP buffer cache                                                           0          0          0
RECYCLE buffer cache                                                        0          0          0
DEFAULT 2K buffer cache                                                     0          0          0
DEFAULT 4K buffer cache                                                     0          0          0
DEFAULT 8K buffer cache                                                     0          0          0
DEFAULT 16K buffer cache                                                    0          0          0
DEFAULT 32K buffer cache                                                    0          0          0
ASM Buffer Cache                                                            0          0          0

13 rows selected.

SQL> ALTER SYSTEM SET SHARED_POOL_SIZE = 110M;

System altered.

SQL> select COMPONENT,CURRENT_SIZE,MIN_SIZE,MAX_SIZE from v$sga_dynamic_components;

COMPONENT                                                        CURRENT_SIZE   MIN_SIZE   MAX_SIZE
---------------------------------------------------------------- ------------ ---------- ----------
shared pool                                                         117440512  100663296          0
large pool                                                            4194304    4194304          0
java pool                                                             4194304    4194304          0
streams pool                                                                0          0          0
DEFAULT buffer cache                                                155189248  155189248          0
KEEP buffer cache                                                           0          0          0
RECYCLE buffer cache                                                        0          0          0
DEFAULT 2K buffer cache                                                     0          0          0
DEFAULT 4K buffer cache                                                     0          0          0
DEFAULT 8K buffer cache                                                     0          0          0
DEFAULT 16K buffer cache                                                    0          0          0
DEFAULT 32K buffer cache                                                    0          0          0
ASM Buffer Cache                                                            0          0          0

13 rows selected.

3.2.2資料庫緩衝區

     資料庫緩衝區是oracle用來執行SQL的工作區域。在更新資料時,使用者會話不直接更新磁碟上的資料,而是首先複製到資料庫緩衝區快取。更改應用於資料庫緩衝區快取中這些資料塊的副本,塊將在快取中保留一段時間,直至其佔有的緩衝區需要快取另一塊為止。在查詢資料時,資料也要經過快取。會話計算出那些塊包含關鍵的行,並將它們複製到資料庫緩衝區快取。此後,相關行傳輸到會話的PGA作進一步處理。此後資料塊會在資料庫快取區快取中保留一段時間。
   理想狀況下,包含頻繁訪問的資料的所有塊將位於資料庫緩衝區快取中,從而最大程度地減少磁碟I/O的需要。如果緩衝區的快取中儲存的塊的映像與磁碟上的映像不同,那麼這樣的緩衝區常稱為“髒緩衝區”。髒緩衝區必須寫回到資料檔案,然後緩衝區又變得乾淨了。即使再寫入磁碟後,此塊也仍留在記憶體中,可能有一段時間,此緩衝區不會被另一個塊所重寫。
   資料庫緩衝區快取的大小會對效能產生至關重要的影響。快取應足夠大,以便能快取所有頻繁訪問的塊,但也不能太大,以至於它會快取極少使用的塊。如果快取過小,那麼將導致磁碟活動過多,因為頻繁訪問的塊持續從磁碟讀取,並由其他塊使用和重寫,然後再從磁碟讀取。資料庫緩衝區快取在例項啟動時分配。從資料庫9i開始,可以隨時將其調大或調小。可以採用手動方式重調,也可以根據工作負荷自動重調大小(如果啟用了自動化機制)。(優化的時候會用到

修改DB_CACHE_SIZE的方法

1檢視SGA大小 show parameter sga_max_size  db_cache_size的尺寸受SGA的影響為能大於SGA

2檢視show parameter shared_pool_size尺寸

一般來說shared_pool_size+db_cache_size=SGA_MAX_SIZE*70%左右

經過計算再修改db_cache_size

sql>alter system set db_cache_size=大小M  scope=spfile sid='資料庫SID';

sql>shutdown immediate

sql>startup

sql>show parameter db_cache_size

就可以看到修改後的效果了
3.2.3日誌緩衝區
     日誌緩衝區是小型的、用於短期儲存將寫入到磁碟上的重做日誌的變更向量的臨時區域。"變更向量"是應用於某些物件的修改,執行DML語句會生成應用於資料的變更向量。有了重做日誌,資料庫就保證資料永不丟失,每當資料塊放生變更時,都會將應用於塊的變更向量寫到重做日誌,如果需要還原資料檔案,則通過重做日誌,可以將變更向量提取並應用於資料檔案備份。
 會話伺服器程式不將重做記錄直接寫入到重做日誌檔案,否則,每當執行DML語句時,會話將不得不等待磁碟I/O操作完成。相反,會話將重做記錄寫入記憶體中的日誌緩衝區。這樣做的速度將遠比寫入磁碟快。此後,日誌緩衝區寫出到重做日誌檔案。寫操作由日誌寫入器後臺程式(LGWR)完成。
     日誌緩衝區在啟動是例項時分配,如果不重新啟動例項,就不能在隨後調整其大小。在oracle體系結構中,將日誌緩衝區轉儲到磁碟時基本瓶頸之一。DML的速度不能超過LGER將變更向量轉儲到聯機重做日誌檔案的速度。如果重做生成是限制資料庫效能的因素,唯一的選項是使用RAC,在RAC資料庫中,每個例項都有自己的日誌緩衝區和自己的LGWR,這是將重做資料並行寫入磁碟的唯一方法。

3.2.4大池
    大池是一個可選區域,如果建立了大池,則那些在不建立大池的情況下使用共享池記憶體的不同程式將自動使用大池。大池的一個主要用途是供共享的伺服器程式使用。在缺少大吃的情況下,這些程式將使用共享池中的記憶體,將導致對共享池的惡性競爭。如果使用的是共享伺服器或並行伺服器,那麼始終應該建立大池。設定大池的大小與效能無關,如果某個程式需要大記憶體池,而記憶體不夠用,則此程式將失敗併發生錯誤。如果分配的記憶體超過需要,語句的執行速度並不會因此加快。從9i第2版本開始,使用者可以在啟動例項後建立大池,並重設其大小。
3.2.5 JAVA池
  只有當應用程式需要在資料庫中執行java儲存程式時,才需要java池。使用者可以在啟動例項後建立池並重設池的大小,可以完全自動地建立池,並設定池的大小

四、一條SQL的執行過程




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29478450/viewspace-1103642/,如需轉載,請註明出處,否則將追究法律責任。

相關文章