oracle體繫結構剖析

來源:互聯網
上載者:User

 

一、ORACLE案例

1、ORACLE 執行個體
System Global Area(SGA) 和 Background Process 被成為資料庫的執行個體。

2、ORACLE 資料庫
一系列物理檔案的集合(資料檔案,控制檔案,聯機日誌,參數檔案等)

3、系統全域共用區System Global Area(SGA) 
System Global Area 是一塊巨大的共用記憶體地區,他被看做是Oracle 資料庫的一個大緩衝池,這裡的資料可以被ORACLE的各個進程共用。其大小可以通過如下語句查看:
SQL> select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680

更詳細的資訊可以參考V$sgastat、V$buffer_pool

主要包括以下幾個部分:

a、 共用池(Shared pool)
共用池是SGA中最關鍵的記憶體片段,特別是在效能和延展性上。一個太小的共用池會扼殺效能,使系統停止,太大的共用池也會有同樣的效果,將會消耗大量的CPU來管理這個共用池。不正確的使用共用池只會帶來災難。共用池主要又可以分為以下兩個部分:
·SQL語句緩衝(Library Cache)
當一個使用者提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程類似於編譯,會耗費相對較多的時間。在分析完這個 SQL,Oracle會把他的分析結果給儲存在Shared pool的Library Cache中,當資料庫第二次執行該SQL時,Oracle自動跳過這個分析過程,從而減少了系統啟動並執行時間。這也是為什麼第一次啟動並執行SQL 比第二次啟動並執行SQL要慢一點的原因。

下面舉例說明parse的時間
SQL> select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
這是在Share_pool 和Data buffer 都沒有資料緩衝區的情況下所用的時間
SQL> alter system flush SHARED_POOL;
System altered.

清空Share_pool,保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.00

從兩句SQL 的時間差上可以看出該SQL 的Parse 時間約為00:00:00.02
對於儲存在共用池中的SQL語句,可以從V$Sqltext、v$Sqlarea中查詢到,對於編程者來說,要盡量提高語句的重用率,減少語句的分析時間。一個設計的差的應用程式可以毀掉整個資料庫的Share pool,提高SQL語句的重用率必須先養成良好的變成習慣,盡量使用Bind變數。

 

·資料字典緩衝區(Data Dictionary Cache)

顯而易見,資料字典緩衝區是ORACLE特地為資料字典準備的一塊緩衝池,供ORACLE內部使用,沒有什麼可以說的。

b、塊緩衝區快取(Database Buffer Cache)
這些緩衝是對應所有資料檔案中的一些被使用到的資料區塊。讓他們能夠在記憶體中進行 操作。在這個層級裡沒有系統檔案,,戶資料檔案,臨時資料檔案,復原段檔案之分。也就是任何檔案的資料區塊都有可能被緩衝。資料庫的任何修改都在該緩衝裡完成,並由DBWR進程將修改後的資料寫入磁碟。

這個緩衝區的塊基本上在兩個不同的列表中管理。一個是塊的“髒”表(Dirty List),需要用資料庫塊的書寫器(DBWR)來寫入,另外一個是不髒的塊的列表 (Free List),一般的情況下,是使用最近最少使用(Least Recently Used,LRU)演算法來管理。
塊緩衝區快取又可以細分為以下三個部分(Default pool,Keep pool,Recycle pool)。如果不是人為設定初始化參數(Init.ora),ORACLE將預設為Default pool。

由於 作業系統定址能力的限制,不通過特殊設定,在32位的系統上,塊緩衝區快取最大可以達到1.7G,在64位系統上,塊緩衝區快取最大可以達到10G。

c、重做日誌緩衝區(Redo log buffer)

重做記錄檔的緩衝區,對資料庫的任何修改都按順序被記錄在該緩衝,然後由LGWR進程將它寫入磁碟。這些修改資訊可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。

重做日誌緩衝區的存在是因為記憶體到記憶體的 操作比較記憶體到硬碟的速度快很多,所以重作日誌緩衝區可以加快資料庫的 操作速度,但是考慮的資料庫的一致性與可恢複性,資料在重做日誌緩衝區中的滯留時間不會很長。所以重作日誌緩衝區一般都很小,大於3M之後的重作日誌緩衝區已經沒有太大的實際意義。

d、Java程式緩衝區(Java Pool)

Java 的程式區,Oracle 8I 以後,Oracle 在核心中加入了對Java的支援。該程式緩衝區就是為Java 程式保留的。如果不用Java程式沒有必要改變該緩衝區的預設大小。

 

e、大池(Large Pool)

大池的得名不是因為大,而是因為它用來分配大塊的記憶體,處理比共用池更大的記憶體,在8.0開始引入。
下面對象使用大池:
·MTS——在SGA的Large Pool中分配UGA
·語句的並行查詢(Parallel Executeion of Statements)——允許進程間訊息緩衝區的分配,用來協調並行查詢服務器
·備份(Backup)——用於RMAN磁碟I/O緩衝

 

 

4、後台進程(Background process)

後台進程是Oracle的程式,用來管理資料庫的讀寫,恢複和監視等工作。Server Process主要是通過他和user process進行聯絡和溝通,並由他和user process進行資料的交換。在Unix機器上,Oracle後台進程相對於作業系統進程,也就是說,一個Oracle後台進程將啟動一個作業系統進程;在Windows機器上,Oracle後台進程相對於作業系統線程,開啟工作管理員,我們只能看到一個ORACLE.EXE的進程,但是通過另外的工具,就可以看到包含在這裡進程中的線程。

在Unix上可以通過如下方法查看後台進程:

ps –ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
oracle 29431 1 0 Sep 02 ? 2:02 ora_dbwr_SID
oracle 29444 1 0 Sep 02 ? 0:03 ora_ckpt_SID
oracle 29448 1 0 Sep 02 ? 2:42 ora_smon_SID
oracle 29442 1 0 Sep 02 ? 3:25 ora_lgwr_SID
oracle 29427 1 0 Sep 02 ? 0:01 ora_pmon_SID

a、Oracle系統有5 個基本進程他們是
DBWR(資料檔案寫入進程)
LGWR(記錄檔寫入進程)
SMON(系統監護進程)
PMON(使用者進程監護進程)
CKPT(檢查點進程,同步資料檔案, 記錄檔,控制檔案)

b、DBWR
將修改過的資料緩衝區的資料寫入對應資料檔案
維護系統內的空緩衝區
這裡指出幾個容易錯誤的概念:
·當一個更新提交後,DBWR把資料寫到磁碟並返回給使用者提交完成.
·DBWR會觸發CKPT 後台進程
·DBWR不會觸發LGWR 進程
上面的概念都是錯誤的.
DBWR是一個很底層的背景工作處理序,他批量的把緩衝區的資料寫入磁碟。和任何前台使用者的進程幾乎沒有什麼關係,也不受他們的控制。至於DBWR會不會觸發LGWR和CKPT進程,我們將在下面幾節裡討論。
DBWR工作的主要條件如下
·DBWR 逾時
·系統中沒有多的空緩衝區用來存放資料
·CKPT 進程觸發DBWR 等

c、LGWR
將重做日誌緩衝區的資料寫入重做記錄檔,LGWR是一個必須和前台使用者進程通訊的進程。當資料被修改的時候,系統會產生一個重做日誌並記錄在重做日誌緩衝區內。這個重做日誌可以類似的認為是以下的一個結構:
SCN=000000001000
資料區塊ID
對象ID=0801
資料行=02
修改後的資料=0011
提交的時候,LGWR必須將被修改的資料的重做日誌緩衝區內資料寫入日誌資料檔案,然後再通知前台進程提交成功,並由前台進程通知使用者。從這點可以看出LGWR承擔了維護系統資料完整性的任務。
LGWR 工作的主要條件如下
·使用者提交
·有1/3 重做日誌緩衝區未被寫入磁碟
·有大於1M 重做日誌緩衝區未被寫入磁碟
·逾時
·DBWR需要寫入的資料的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入

d、SMON
工作主要包含
    ·清除臨時空間
    ·在系統啟動時,完成系統執行個體恢複
    ·聚結空閑空間
    ·從停用檔案中恢複事務的活動
    ·OPS中失敗節點的執行個體恢複
    ·清除OBJ$表
    ·縮減復原段
    ·使復原段離線

e、PMON
主要用於清除失效的使用者進程,釋放使用者進程所用的資源。如PMON將復原未提交的工作,釋放鎖,釋放分配給失敗進程的SGA資源。

f、CKPT
同步資料檔案,記錄檔和控制檔案,由於DBWR/LGWR的工作原理,造成了資料檔案,記錄檔,控制檔案的不一至,這就需要CKPT進程來同步。CKPT會更新資料檔案/控制檔案的頭資訊。

CKPT工作的主要條件如下
·在日誌切換的時候
·資料庫用immediate ,transaction , normal 選項shutdown 資料庫的時候
·根據初始話檔案LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設定的數值來確定
·使用者觸發
以下進程的啟動需要手工配置

g、ARCH
當資料庫以歸檔方式啟動並執行時候,Oracle會啟動ARCH進程,當重做記錄檔被寫滿時,記錄檔進行切換,舊的重做記錄檔就被ARCH進程複製到一個/多個特定的目錄/遠程機器。這些被複製的重做記錄檔被叫做歸檔記錄檔。

h、RECO
負責解決分布事物中的故障。Oracle可以串連遠端多個資料庫,當由於網路問題,有些事物處於懸而未決的狀態。RECO進程試圖建立與遠程伺服器的通訊,當故障消除後,RECO進程自動解決所有懸而未決的會話。

i、服務進程Server Process

服務進程的分類:

·專用服務進程(Dedicated Server Process)
一個服務進程對應一個使用者進程

·共用服務進程(MultiTreaded Server Process)
一個服務進程對應多個使用者進程,輪流為使用者進程服務。

PGA & UGA
PGA = Process Global Area
UGA = User Global Area
他儲存了使用者的變數、許可權、堆棧、排序空間等使用者資訊,對於專用伺服器處理序,UGA在PGA中分配。對於多線程進程,UGA在Large pool中分配。

j、使用者進程User Process

在用戶端,將使用者的SQL 陳述式傳遞給服務進程

 

5、一個貫穿資料庫全域的概念----系統改變號SCN(System Change Number)
系統改變號,一個由系統內部維護的序號。當系統需要更新的時候自動增加,他是系統中鑑效組資料的一致性和順序恢複的重要標誌。

a. 查詢語句不會使SCN增加,就算是同時發生的更新,資料庫內部對應的SCN也是不同的。這樣一來就保證了資料恢複時候的順序。

b. 鑑效組資料的一致性,當一個查詢執行的時候,他會先從系統中得到一個當前的SCN號,在他尋找資料的同時,他會檢查每個資料行和他對應的SCN號,只有那些不比他的SCN號大的行才能從對應使用者資料檔案的緩衝區內取出,而那些大於他SCN號的行,就應該從復原段資料檔案的緩衝中取出。

 

執行個體分析:

一個查詢返回以下5 行
ID Name
------------------------
1 ShangHai
2 Beijing
3 Gugangzhou
4 ShenZhen
5 HanZhou

使用者A從12:00開始運行,到12:05結束在12:01使用者B執行了一條Update語句,更新了ID是2的那條記錄把Beijing該成了 Tianjing.並提交,這時候使用者A 的那個查詢是不會出現Tianjing的記錄。12:00查詢時候的SCN是N然後使用者B的更新使得系統的 SCN變成N+1當使用者A查詢到ID=2的記錄的時候發現他的SCN已經大於查詢開始時候的SCN,他就會在復原段資料緩衝中找到SCN=N的那條記錄,並把它返回。

 

二、ORACLE 資料庫

ORACLE資料庫的組成——物理作業系統檔案的集合。主要包括以下幾種。

1、控制檔案(參數檔案init.ora記錄了控制檔案的位置)

控制檔案包括如下主要資訊
·資料庫的名字,檢查點資訊,資料庫建立的時間戳記
·所有的資料檔案,聯機記錄檔,歸檔記錄檔資訊
·備份資訊等

有了這些資訊,Oracle就知道那些檔案是資料檔案,現在的重做記錄檔是哪些,這些都是系統啟動和啟動並執行基本條件,所以他是Oracle啟動並執行根本。如果沒有控制檔案系統是不可能啟動的。控制檔案是非常重要的,一般採用多個鏡相複製來保護控制檔案,或採用RAID來保護控制檔案。控制檔案的丟失,將使資料庫的恢複變的很複雜。
控制檔案資訊可以從V$Controlfile中查詢獲得
 
2、資料檔案(資料檔案的詳細資料記載在控制檔案中)

可以通過如下方式查看資料檔案

SQL> select name from v$datafile;
NAME
---------------------------------------------
/u05/dbf/PROD/system_01.dbf
/u06/dbf/PROD/temp_01.dbf
/u04/dbf/PROD/users_01.dbf
/u09/dbf/PROD/rbs_01.dbf
/u06/dbf/PROD/applsys_indx_01.dbf
/u05/dbf/PROD/applsys_data_01.dbf

 

從以上可以看出,資料檔案大致可以分為以下幾類:

 

i. 系統資料檔案(system_01.dbf)
存放系統資料表和資料字典,一般不放使用者的資料,但是使用者指令碼,如過程,函數,包等卻是儲存在資料字典中的。
名詞解釋:資料字典
資料字典是一些系統資料表或視圖,他存放系統的資訊,他包括資料庫版本,資料檔案資訊,表與索引等段資訊,系統的運行狀態等各種和系統有關的資訊和使用者指令碼資訊。資料庫管理員可以通過對資料字典的查詢,就可以瞭解到Oracle的運行狀態。

ii. 復原段檔案(rbs_01.dbf)
如果資料庫進行對資料的修改,那麼就必須使用復原段,復原段是用來臨時存放修改前的資料(Before Image)。復原段通常都放在一個單獨的資料表空間上(復原資料表空間),避免資料表空間片段化,這個資料表空間包含的資料檔案就是復原資料檔案。
iii. 臨時資料檔案(temp_01.dbf)

主要存放使用者的排序等臨時資料,與復原段相似,臨時段也容易引起資料表空間片段化,而且沒有辦法在一個永久資料表空間上開闢臨時段,所以就必須有一個暫存資料表空間,它所包含的資料檔案就是臨時資料檔案,主要用於不能在記憶體上進行的排序操作。我們必須為使用者指定一個暫存資料表空間。

iv. 使用者資料檔案(/applsys_data_01.dbf ,applsys_indx_01.dbf)
存放使用者資料,這裡列舉了兩類常見的使用者型資料,一般資料和索引資料,一般來說,如果條件許可的話,可以考慮放在不同的磁碟上。

 

3、重做記錄檔(聯機重做日誌)

使用者對資料庫進行的任何操作都會記錄在重做記錄檔。在瞭解重做日誌之前必須瞭解重做日誌的兩個概念,重做日誌組和重做日誌群組成員(Member),一個資料庫中至少要有兩個日誌組檔案,一組寫完後再寫另一組,即輪流寫。每個日誌組中至少有一個日誌成員,一個日誌組中的多個日誌成員是鏡相關係,有利於記錄檔的保護,因為記錄檔的損壞,特別是當前聯機日誌的損壞,對資料庫的影響是巨大的。
聯機日誌組的交換過程叫做切換,需要特別注意的是,日誌切換在一個最佳化效果不好的資料庫中會引起臨時的“掛起”。掛起大致有兩種情況:
·在歸檔情況下,需要歸檔的日誌來不及歸檔,而聯機日誌又需要被重新利用
·檢查點事件還沒有完成(日誌切換引起檢查點),而聯機日誌需要被重新利用

解決這種問題的常用手段是:

i.增加日誌組

ii.增大記錄檔成員大小

通過v$log可以查看日誌組,v$logfile可以查看具體的成員檔案。

 

4、歸檔記錄檔
Oracle 可以運行在兩種模式之中,歸檔模式和不歸檔模式。如果不用歸檔模式,當然,你就不會有歸檔日誌,但是,你的系統將不會是一個實用系統,特別是不能用於生產系統,因為你可能會遺失資料。但是在歸檔模式中,為了儲存使用者的所有修改,在重做記錄檔切換後和被覆蓋之間系統將他們另外儲存成一組連續的檔案系列,該檔案系列就是歸檔記錄檔。
有人或許會說,歸檔記錄檔佔領我大量的硬碟空間,其實,具體想一想,你是願意浪費一點磁碟空間來保護你的資料,還是願意丟失你的資料呢?顯而義見,我們需要保證我們的資料的安全性。其實,歸檔並不是一直佔領你的磁碟空間,你可以把她備份到磁帶上,或則刪除上一次完整備份前的所有記錄檔。

 

5、初始化參數檔案
initSID.ora或init.ora檔案,因為版本的不一樣,其位置也可能會不一樣。在8i中,通常位於$ORACLE_HOME/admin/<SID>/Pfile下
初始設定檔案記載了許多資料庫的啟動參數,如記憶體,控制檔案,進程數等,在資料庫啟動的時候載入(Nomount時載入),初始設定檔案記錄了很多重要參數,對資料庫的效能影響很大,如果不是很瞭解,不要輕易亂改寫,否則會引起資料庫效能下降。

6、其他檔案

i . 密碼檔案
用於Oracle 的具有sysdba許可權使用者的認證.

ii. 記錄檔
·警示記錄檔(alert.log或alrt<SID>.ora)
記錄資料庫啟動,關閉和一些重要的出錯資訊。資料庫管理員應該經常檢查這個檔案,並對出現的問題作出即使的反應。你可以通過以下SQL 找到他的路徑 select value from v$PARAMETER where name ='background_dump_dest';

·後台或使用者追蹤檔案
系統進程或使用者進程出錯前寫入的資訊,一般不可能讀懂,可以通過ORACLE的TKPROF工具轉化為可以讀懂的格式。對於系統進程產生的追蹤檔案與警示記錄檔的路徑一樣,使用者追蹤檔案的路徑,你可以通過以下SQL找到他的路徑 select value from v$PARAMETER where name ='user_dump_dest';

 

三、ORACLE邏輯結構

 

1、 資料表空間(tablespace)
資料表空間是資料庫中的基本邏輯結構,一系列資料檔案的集合。一個資料表空間可以包含多個資料檔案,但是一個資料檔案只能屬於一個資料表空間。

2、 段(Segment)
段是對象在資料庫中佔用的空間,雖然段和資料庫物件是一一對應的,但段是從資料庫儲存的角度來看的。一個段只能屬於一個資料表空間,當然一個資料表空間可以有多個段。
資料表空間和資料檔案是實體儲存體上的一對多的關係,資料表空間和段是邏輯儲存上的一對多的關係,段不直接和資料檔案發生關係。一個段可以屬於多個資料檔案,關於段可以指定擴充到哪個資料檔案上面。

段基本可以分為以下四種
·資料區段(Data Segment)
·索引段(Index Segment)
·復原段(Rollback Segment)
·臨時段(Temporary Segment)

 

3、區間(Extent)

關於Extent的翻譯有多種解釋,有的譯作擴充,有的譯作盤區,我這裡通常譯為區間。在一個段中可以存在多個區間,區間是為資料一次性預留的一個較大的儲存空間,直到那個區間被用滿,資料庫會繼續申請一個新的預留儲存空間,即新的區間,一直到段的最大區間數(Max Extent)或沒有可用的磁碟空間可以申請。

在ORACLE8i以上版本,理論上一個段可以無窮個區間,但是多個區間對ORACLE卻是有效能影響的,ORACLE建議把資料分布在盡量少的區間上,以減少ORACLE的管理與磁頭的移動。

 

4、Oracle資料區塊(Block)

ORACLE最基本的儲存單位,他是OS資料區塊的整數倍。ORACLE的操作都是以塊為基本單位,一個區間可以包含多個塊(如果區間大小不是塊大小的整數倍,ORACLE實際也擴充到塊的整數倍)。

 

5、基本資料表空間介紹

 

a. 系統資料表空間

主要存放資料字典和內部系統資料表基表
查看資料資料字典的SQL
select * from dict
查看內部系統資料表的SQL
select * from v$fixed_view_definition
DBA對系統的系統資料表中的資料字典必須有一個很深刻的瞭解,他們必須準備一些基礎的SQL語句,通過這些SQL可以立即瞭解系統的狀況和資料庫的狀態,這些基本的SQL包括
系統的剩餘空間
系統的SGA 
狀態系統的等待
使用者的許可權
當前的使用者鎖
緩衝區的使用狀況等
在成為DBA 的道路上我們不建議你過分的依賴於OEM/Quest 等優秀的資料庫管理工具,因為他們不利於你對資料資料字典的理解,SQL語句可以完成幾乎全部的資料庫管理工作。
大量的讀少量的寫是該資料表空間的一個顯著的特點。

 

b. 暫存資料表空間.
暫存資料表空間顧名思義是用來存放臨時資料的,例如排序操作的臨時空間,他的空間會在下次系統啟動的時候全部被釋放。

c. 復原段資料表空間

i. 復原段在系統中的作用
當資料庫進行更新插入刪除等操作的時候,新的資料被更新到原來的資料檔案,而舊的資料(Before Image)就被放到復原段中,如果資料需要復原,那麼可以從復原段將資料再複製到資料檔案中。來完成資料的復原。在系統復原的時候, 復原段可以用來復原沒有被commit 的資料,解決系統的一直性讀。

   復原段在什麼情況下都是大量的寫,一般是少量讀,因此建議把復原段單獨出來放在一個單獨的裝置(如單獨的磁碟或RAID),以減少磁碟的IO爭用。 

ii. 復原段的工作方式

·一個復原資料表空間可以被劃分成多個復原段.
·一個復原段可以儲存多個會話的資料.

·復原段是一個圓形的資料模型
假設復原段由4 個區間組成,他們的使用順序就是區間1à區間2à區間3à區間4à區間1。也就是說,區間是可以迴圈使用的,當區間4到區間1的時候,區間1裡面的會話還沒有結束, 區間4用完後就不能再用區間1,這時系統必須分配區間5,來繼續為其他會話服務服務。

我們分析一個Update 語句的完成

①. 使用者提交一個Update 語句
②. Server Process 檢查記憶體緩衝.

如果沒有該資料區塊的緩衝,則從磁碟讀入

i. 如果沒有記憶體的有效空間,DBWR被啟動將未寫入磁碟的髒緩衝寫入磁碟

ii. 如果有有效空間,則讀入

③. 在緩衝內更新資料

i. 申請一個復原段入口,將舊資料寫如復原段

ii. 加鎖並更新資料

iii. 並在同時將修改記錄在Redo log buffer中

④. 使用者提交一個Commit 語句

i. SCN增加

ii. 將Redo log buffer 寫入Redo log file

iii. 返回使用者Commit 完成

四、ORACLE核心初探

1、LRU 演算法和資料緩衝區

我們知道Oracle 資料庫的檔案大小遠遠大於Oracle 的所擁有的記憶體地區SGA,LRU就是一種儘可能將常用的資料保留在記憶體的演算法。當資料庫需要一個資料緩衝區,他會從資料庫緩衝區的LRU隊列的尾部找一個閒置緩衝,將一個資料區塊讀入,然後資料庫會把這個緩衝區放到LRU 隊列的中部,如果該緩衝被其他程式用到的話,那麼他會往隊列的頭上移動,如果這個緩衝沒有被其他程式用到,並且沒有被修改過,那麼他會慢慢的移動到LRU 隊列的尾部,最終被認為是空緩衝區被其他資料區塊所覆蓋。一旦這個緩衝區被修改過DBWR把他從LRU隊列中移出,放到LRUW 隊列(也叫贓緩衝區)中,等待DBWR把他們批量寫入資料檔案,然後再把他們的緩衝區串連到LRU隊列的尾部,周而復始的工作。

理解HASH演算法,為了提高速度Oracle在設計中採用了大量的HASH演算法,這裡我們講一下HASH演算法的理論知識,在以後的閱讀中會對Oracle有更好的理解。HASH是一種以空間換取時間的做法。假如我有100萬條資料,以隊列的方式儲存,如果我要從裡面找一條資料,那麼我要從頭開始找,我所需要的空間是100萬個儲存單元,如果我用HASH的方法來儲存,我把儲存空間劃分為1000*2000的數組,把100萬個資料分別按照如下規則添入該數組:

1. 定義一個函數,使得每條資料對應一個0-999的值

2. 把該行記錄儲存在以函數傳回值為下標的數組裡

3. 我們稱該函數為hash 函數f(row). hash 函數的傳回值為hash 值.數組為

hash 數組HashArray[n][m].

即有下列公式
find a unused buffer in HashArray[f(row)][?]
HashArray[f(row)][?] = row;

這樣,當我們需要一個行時候我們只需簡單的計算該行的hash值,然後到下標為hash值的hash數組裡找就可以了。即使用最簡單的方法也可以很快的找到

For (I=1;I<=2000; I ++)
If (HashArray[f(row)][I] == row ) return;
Next

當然HASH演算法還是很複雜的,這裡只是一個最最簡單的例子。如果大家有興趣可以看看有關資料結構的資料,這裡就不具體展開了。
 
2、LATCH(Oracle內部鎖)

有許多人問我Latch和Lock 的區別,其實很簡單,Latch是Oracle內部的Lock,他負責更為細小的內部讀寫,比如Oracle要把使用者更新的資料寫入緩衝區,這時候Oracle就會在該緩衝區上加上latch,用來防止DBWR把他寫出到磁碟,因為如果沒有這個Latch,DBWR會把一半新一半老沒有用的資料寫到磁碟上。
 
五、常見問題

1、執行個體和SID的關係是什嗎?

經常有人問SID 是什嗎?在Oracle 系統中SID 是一個經常出現的變數,如環境變數ORACLE_SID, 初始設定檔案initSID.ora,那究竟什麼是SID 呢?其實SID 就是Oracle 執行個體的標識,不同的SID 對應不同的記憶體緩衝(SGA)和不同的後台進程。這樣一來我們就可以得當在一台物理的伺服器上可以有多個SID 的資料庫執行個體。

2、Oracle資料庫和執行個體的關係是什嗎?

資料庫是由物理檔案和存取資料檔案的執行個體組成,當存取資料檔案的執行個體是一個的時候,資料庫被稱做單節點資料庫。這是我們看到的最多的資料庫形式。當然還有一種多節點資料庫,就是一個以上的執行個體共同訪問一個資料庫(或者說共同訪問一組資料檔案), 更好的提供穩定性和平行處理能力。這在8i中被稱為OPS(Oracle Parallel Server ),在Oracle9i 中被稱為RAC(real application cluster)。在這種資料庫中。兩個/多個執行個體分別在不同伺服器上,所有 Oracle 資料檔案在共用的磁碟陣列上,多個伺服器上的執行個體可以同時工作,他們通過一個內部的網路進行通訊。如果一台伺服器不能提供服務的話,另一台會接管它的工作,特別是在關鍵的業務有很大的潛力。

3、在啟動並執行資料庫中資料檔案中是不是可能存在沒有被提交的資料?

這是可能存在的,因為使用者資料檔案的資料是由DBWR寫入的,DBWR是一個很底層的後台進程,不負責與使用者互動。使用者的互動是由LGWR完成的。

4、在問題3中,如果存在沒有寫入的資料,那麼機器突然斷電,資料完整性會不會損壞?

不會的,因為資料庫的完整性是LGWR來保證的,而且ORACLE保證了DBWR寫入資料檔案的任何修改已經被記錄在重做記錄檔中。當系統再次啟動的時候,通過讀取重做記錄檔就可以知道那些資料沒有被提交。這時候ORACLE 會自動復原那些資料。所以說聯機日誌的損壞,特別是當前聯機日誌的損壞,對資料庫的影響是巨大的,可能會導致資料庫的不完整。

5、資料檔案損壞會遺失資料嗎?

可以這麼說,如果你有備份和歸檔,就不會。因為所有對資料修改的記錄都在重做日誌中有記錄,所以不會遺失資料,你只要恢複以前的備份再用歸檔記錄檔恢複和當前的線上重做日誌就可以恢複所有資料。

6、線上重做日誌損壞會遺失資料嗎?

以上說了,線上日誌對資料庫的損壞是極大的,所以不僅可能遺失資料,還可能引起資料庫的不同步。在重做日誌中的所有commit的記錄都會丟失,這也是Oracle 為什麼要對線上重做記錄檔做鏡像的原因。任何的資料丟失都是不允許的。

7、我在事務能不能指定不寫復原段?

不可以的,寫復原段是ORACLE保證一致性讀和事務一致性的根本。復原段是高寫入段,建議把它放到單獨的裝置上來。
對於DDL語句,如DROP,TRUNCATE卻可以不寫復原段(沒有UNDO資訊),所以對於整個表的刪除,如果資料量比較大,建議用Truncate Table的方法。

不寫聯機日誌也是不可能的,但可以在某些特定操作中,可以寫很少的聯機日誌,如以NOLOGGING的方式通過Create table tablename as select建立表,或以Append的方式Insert資料到表,或直接載入等操作。

 

 

 

六、小結

 

這裡,我們瞭解了執行個體和資料庫的關係,一個資料庫可以有多個執行個體,但是一個執行個體卻不可能對應多個資料庫,在一般的情況下,我們都是用的單節點資料庫,即一個執行個體僅僅對應一個資料庫。

我們瞭解了ORACLE執行個體的組成,包括記憶體和後台進程,進一步解釋了SGA的組成與SGA的作用,並分析了語句重用的好處。在後台進程中,重要的闡述了DBWR與LGWR,其中DBWR是一個底層的由ORACLE控制的後台進程,而LGWR負責與使用者互動.

在ORACLE資料庫中,我們重要闡述了資料庫的物理與邏輯結構,在物理結構中,需要注意四類以下檔案:控制檔案,聯機日誌,資料檔案與參數檔案。在邏輯結構中,需要清楚每個邏輯結構的關係,從大到小的順序為:資料表空間à段à區間à塊。

最後,簡單的描敘了兩個ORACLE的核心內容,LRU演算法與LATCH,並初步闡述了HASH演算法的相關內容。有關ORACLE更多的核心內容,可以參考相關資料。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.