Oracle 體系結構二 記憶體結構

2022-09-14 02:21:09 字數 3826 閱讀 1803

oracle例項由共享記憶體塊(sga)以及大量的後台程序構成。

sga必須包含的資料結構:

可選的資料結構:

使用者會話還需要伺服器端的記憶體。此記憶體是不共享的pga。每個會話都有自己專用的pga。

資料庫緩衝區快取

資料庫緩衝區快取是oracle用來執行sql的工作區域。

在更新資料時,使用者的會話不直接更新磁碟上的資料。包含相關資料的資料塊首先複製到資料庫緩衝區快取。更改應用於資料庫緩衝區快取中的這些資料塊的副本。此後,塊將在快取中保留一段時間,直至其占有的緩衝區需要快取另一塊為止。

在查詢資料時,資料也要經過快取。會話計算出哪些塊包含相關的行,並將它們複製到資料庫緩衝區快取。此後,相關行的投影列傳輸到會話的pga作進一步處理。與上面一樣,此後塊會在資料庫緩衝區快取中保留一段時間。

資料檔案的格式被設定為固定大小的塊。錶行和其他資料物件儲存在這些塊中。資料庫緩衝區快取的格式被設定為記憶體緩衝區,每個可以容納乙個塊。與塊不同,行的長度取決於為表定義的列的數量(不管列是否真的包含內容,也不考慮包含什麼內容)。根據塊的大小(由dba選擇)和行的大小(取決於表設計和使用),每個塊中可能有多個行,也可能有乙個行延伸到多個塊中。

如果緩衝區的快取中儲存的塊的映像與磁碟上的映像不同,那麼這樣的緩衝區常稱為「髒緩衝區」。當塊第一次複製到其中時,緩衝區是「乾淨緩衝區」:此時,緩衝區中的塊的映像與磁碟上的塊映像是相同的。當其中的塊更新時,緩衝區將變髒。最終,髒緩衝區必須寫回到資料檔案,此時,緩衝區又變得乾淨了。即使在寫入磁碟後,此塊也仍保留在記憶體中,可能有一段時間,此緩衝區不會被另乙個塊所重寫。緩衝區的更新頻率(或commit的數量)與何時寫回資料檔案沒有任何關係:改變了的塊可以在commit命令之前或之後寫入資料檔案。在正常執行過程中,常常有未提交的資料要寫入資料檔案,或已提交的更改還沒有寫入。

在緩衝區快取中管理塊:

緩衝區快取中的塊實質上在乙個位置上管理,但有兩個不同的列表指向這些塊。 

oracle採用了一種接觸技術(touch count,也稱使用計數)演算法,如果命中快取中的乙個塊,則會增加與之關聯的計數器。不是說每次命中這個塊都會增加技術,而是大約3秒一次。有一組相當神奇的x$表,利用其中的某個表就可以看出這個演算法是怎樣工作的。x$bh表顯示了塊緩衝區快取中塊的有關資訊(文件中有記錄的v$bh檢視也能提供塊的有關資訊,不過x$bh表提供的資訊更多)。在這個表中可以看到,我們命中塊是,接觸技術會增加。可以對這個表執行一下查詢,得到5個「當前最熱的塊」,並把這個資訊與dba_objects檢視聯結,得出這些塊屬於哪些段。

1

select

tch,

2file#,3

dbablk,

4case

5when obj =

4294967295

then6'

rbs/compat segment'7

else

8 (select

max('('

|| object_type ||')

'|| owner ||'.

'||9object_name) || decode(count(*), 1, '', '

maybe!')

10from

dba_objects

11where data_object_id =

x.obj)

12end

what

13from (select tch, file

#, dbablk, obj

14from

x$bh

15where state <>016

order

by tch desc) x

select

*from dba_extents where

file_id

=file# and block_id <= dbablk and block_id+blocks-

1>= dbablk

對於重複查詢的塊,也可以觀察oracle如何遞增這個塊的接觸計數

1

select tch,file#,dbablk,dummy

2from x$bh,(select

dummy

from

dual)

3where obj = (select

data_object_id

4from

dba_objects

5where

object_name='

dual'6

and data_object_id is

notnull)

資料庫緩衝區快取的大小會對效能產生至關重要的影響。快取應足夠大,以便能快取所有頻繁訪問的塊,但也不能過大,以至於它會快取極少使用的塊。如果快取過小,那麼將導致磁碟活動過多,因為頻繁訪問的塊持續從磁碟讀取,並由其他塊使用和重寫,然後再從磁碟讀取。如果需要格式化乙個極大的資料庫緩衝區快取,則例項的啟動速度會變慢。

可以動態調整資料庫緩衝區快取的大小,也可以對其進行自動管理。

日誌緩衝區

日誌緩衝區是小型的臨時區域,用於短期儲存將寫入到磁碟上的重做日誌的變更向量。執行dml語句會生成應用於資料的變更向量。有了重做日誌,資料庫就可以確保資料永不丟失:每當資料塊發生更改時,都會將應用於塊的變更向量寫到重做日誌,如果需要還原資料檔案,則通過重做日誌,可以將變更向量提取並應用於資料檔案備份。這樣,資料檔案就可能是最新的。

會話伺服器程序不將重做記錄直接寫入重做日誌檔案,否則,每當執行dml語句是,會話將不得不等待磁碟i/o操作完成。相反,會話將重做記錄寫入記憶體中的日誌緩衝區。這樣做的速度將遠比寫入磁碟快。此後,日誌緩衝區寫出到重做日誌檔案。因此,日誌緩衝區對磁碟的一次寫入是來自多個事務的一批變更向量。即使如此,日誌緩衝區中的變更向量也是接近實時地寫入磁碟,當會話發出commit語句時,會實時執行日誌緩衝區寫操作。寫操作由日誌寫入器後台程序(lgwr)完成。

日誌緩衝區預設值由oracle伺服器確定,而且取決於伺服器節點中的cpu數量。預設值通常是合適的。

理解commit語句的處理過程非常重要。當發出commit語句時,一部分提交處理涉及將日誌緩衝區內容寫入磁碟上的重做日誌檔案。寫操作實施執行,在其進行過程中,發出commit的會話將掛起。要確保提交的事務永不丟失,那麼,在快取中的資料塊發生更改(意味著事務已完成)而且將變更向量寫入磁碟上的重做日誌前,不能講完成提交的訊息返回給會話。

在oracle體系結構中,將日誌緩衝區轉儲到磁碟是基本瓶頸之一。dml的速度不能超過lgwr將變更向量轉儲到聯機重做日誌檔案的速度。

日誌緩衝區的大小固定不變,在啟動例項時被設定為固定值。無法對其進行自動管理。

共享池

共享池是最複雜的sga結構。它分為許多子結構,這些子結構由oracle伺服器內部管理。

庫快取庫快取是記憶體區域,按其已分析的格式儲存最近執行的**,可以在不重新分析的情況下重用,極大的提高效能。

資料字典快取

資料字典快取有時稱為「行快取」。儲存最近使用的物件定義:表、索引、使用者和其他元資料定義的描述。將此類定義放在sga的記憶體中,以便使所有會話可以直接訪問它們,而不是被迫從磁碟上的資料字典中重複讀取它們,從而提高分析效能。快取的物件定義可以用於分析許多不同的語句。

sql查詢和pl/sql函式結果快取

oracle伺服器可以將此類查詢的結果儲存在記憶體中。結果快取機制具有足夠的智慧型,跟蹤查詢執行所針對的表是否發生了更新。預設方式下,將禁用sql查詢和pl/sql函式結果快取,但如果以程式設計方式將其啟用,就可以極大地提高效能。此快取位於共享池中:dba可以指定其最大容量。

共享池在例項啟動時分配。可以採用手動方式重新調整,也可以根據工作負荷自動重新調整大小(如果啟動了自動化機制)。

oracle體系結構

oracle由例項和資料庫組成 例項是由sga system global area 和一系列後台程序組成的,其中sga最主要劃分為共享池 shared pool 資料緩衝區 db cache 和日誌緩衝區 log buffer 後台程序包括pmon smon lckn reco ckpt dbwr...

oracle體系結構

一.oracle資料庫的後台程序 dbwr 資料庫寫程序,負責將更改的資料從資料庫緩衝區寫入資料檔案 smon 系統監控,檢查資料庫的狀態,恢復資料庫的例項 pmon 程序監控,負責oracle程序失敗時資源清理釋放 chpt 檢查點程序,每當緩衝區資料寫入檔案時,更新控制檔案的資料庫狀態資訊 ar...

oracle體系結構

oracle體系結構圖 1.1 為什麼oracle資料庫管理系統要引進非常複雜的體系結構 更高效的使用記憶體,保證資料庫不丟失任何資料 1.2 常用術語 1.2.1 程序 一段記憶體正在執行的程式 1.2.2 後台程序 可以有多個後台程序 1.2.3 緩衝區 臨時儲存資料的記憶體區 1.3 orac...