幾個程式觸發條件(zt)

tolywang發表於2007-06-27
資料庫寫入程式( DBWR ) 1
查詢( Query )處理步驟 1
發出COMMIT 命令時執行下面的步驟 2
快速提交( Fast Commit ) 2
日誌寫入程式( LGWR ) 2
檢查點( CKPT ) 3
強制檢查點 3
設定資料庫檢查點時間間隔 3
LOG_CHECKPOINT_INTERVAL 3
LOG_CHECKPOINT_TIMEOUT 4
FAST_START_IO_TARGET 4






資料庫寫入程式( DBWR ) 1
查詢( Query )處理步驟 1
發出COMMIT 命令時執行下面的步驟 2
快速提交( Fast Commit ) 2
日誌寫入程式( LGWR ) 2
檢查點( CKPT ) 3
強制檢查點 3
設定資料庫檢查點時間間隔 3
LOG_CHECKPOINT_INTERVAL 3
LOG_CHECKPOINT_TIMEOUT 4
FAST_START_IO_TARGET 4





查詢( Query )處理步驟
查詢不同於其它型別的SQL 語句,因為如果查詢成功它們會返回作為結果的資料,查詢可以返回一行或者上千行,而其它語句只是返回成功或失敗,查詢的處理有三個主要階段:
 分析編譯SQL 語句
 執行標識選定的行或對資料應用DML 更改
 提取返回SELECT 語句查詢的行

1. 分析SQL 語句:在分析階段SQL 語句從使用者程式傳遞到伺服器程式,並且SQL 語句的分析說明被載入共享的SQL 區,在分析過程中伺服器程式做如下工作:
 在共享池中搜尋SQL 語句的現有副本
 透過檢查語法驗證SQL 語句
 執行資料字典查詢來驗證表和列的定義
 分析SQL 語句續
 獲取物件的分析鎖以便在語句的分析過程中物件的定義不會改變
 檢查使用者訪問引用方案物件的許可權
 確定語句的最佳執行計劃
 將語句和執行計劃載入共享的SQL 區
主意:分析階段包括處理某些要求,不論語句執行多少次這些要求通常只需要處理一次。Oracle 伺服器總是驗證使用者是否具有執行SQL 語句所需的許可權。
2. 執行SELECT 語句:到了SELECT 語句這一步伺服器程式準備要檢索資料了
3. 提取查詢行:在提取階段對行進行選擇和排序(如有必要)並且由伺服器返回給使用者


發出COMMIT 命令時執行下面的步驟
1. 伺服器程式隨同SCN 一起在重做日誌緩衝區中放置一個提交記錄。
2. LGWR 向重做日誌檔案中連續寫入,直到提交記錄(含提交記錄)的所有重做日誌緩衝區條目,這之後Oracle 伺服器就能夠保證即使存在例程失敗也不會丟失更改。
3. 通知使用者COMMIT 命令已完成
4. 伺服器程式記錄資訊以指出事務處理已完成,並且可以釋放資源鎖,將灰資料緩衝區重新整理到資料檔案由DBW0 獨立執行,在提交之前或之後進行都可以。(因此請牢記,DBWR的觸發不依賴於Commit行為)

快速提交( Fast Commit )
快速提交機制將更改寫入重做日誌緩衝區而不是寫入資料檔案,這樣確保資料得以恢復,Oracle 伺服器使用這種機制來保證提交的更改能夠在例程失敗的情況下得以恢復。它有如下優勢
 連續寫入日誌檔案比寫入資料檔案的各個塊更快。(因為日誌檔案是順序寫的)
 只將記錄更改必須的最少資訊寫入日誌檔案,然而寫入資料檔案卻需要寫入整個資料塊(它記錄被更改的塊,更改位置,以及重做條目中的新值。)。
 如果多個事務處理同時請求提交那麼例程將重做日誌記錄合成為單個寫入。
 除非重做日誌緩衝區特別滿否則每個事務處理只需要一個同步寫入,如果發生合成,那麼每個事務處理的同步寫入可能不到一個, 因為提交之前可能會重新整理重做日誌緩衝區,所以事務處理的大小並不影響實際的提交操作所需的時間量。(因為,每3秒,重做日誌緩衝區填滿1M,重做日誌緩衝區填滿1/3,或者事務提交的時候的時候,LGWR程式會將REDO LOG BUFFER中內容的寫入到REDO LOG FILE 中。)
注:回退事務處理並不會觸發LGWR 寫入磁碟(因為沒有提交的資料本身不會被寫入資料檔案)。


資料庫寫入程式( DBWR )
伺服器程式在緩衝區快取記憶體中記錄回退和資料塊的更改,資料庫寫入程式(DBW0) 將灰資料緩衝區從資料庫緩衝區快取記憶體寫入資料檔案,它確保有足夠數量的空閒緩衝區,即當伺服器程式需要讀取資料檔案中的塊時,可以覆蓋的緩衝區在資料庫緩衝區快取記憶體中可用。由於伺服器程式只在緩衝區快取記憶體中進行更改,因此資料庫效能得到改善,而且DBW0 延遲寫入資料檔案直到發生下列事件之一:
 灰資料緩衝區的數量達到閾值;
 當進行掃描而無法找到任何空閒緩衝區時程式掃描了指定數量的塊;
 出現超時每三秒;
 出現檢查點(檢查點是使資料庫緩衝區快取記憶體與資料檔案同步的一種方法)


日誌寫入程式( LGWR )
LGWR 在下列情況下執行從重做日誌緩衝區到重做日誌檔案的連續寫入:
 當提交事務處理時( Commit )
 當重做日誌緩衝區的三分之一已滿時
 當重做日誌緩衝區中記錄了超過1 MB 的更改時
 在DBW0 將資料庫緩衝區快取記憶體中修改的塊寫入資料檔案以前

因為恢復操作需要重做,所以LGWR 只在重做寫入磁碟後確認COMMIT 命令。(所以,LGWR是5個不可缺少的後臺程式中,唯一個與SQL語句執行相關的程式。當然,SQL語句的執行還要依賴於在客戶端執行的使用者程式和在伺服器端執行的伺服器程式。)

檢查點( CKPT )
檢查點後臺程式(CKPT)用於更新所有資料檔案和控制檔案的標題以反映該程式已成功完成,使資料庫檔案同步。

資料庫在檢查點期間做如下工作: DBWn 將許多由正在經歷檢查點事件的日誌覆蓋的灰資料庫緩衝區寫入到資料檔案中。由DBWn 寫入的緩衝區數量由引數FAST_START_IO_TARGET 決定。

檢查點可發生在下面情況中:
 每次日誌切換時;
 當已透過正常事務處理或者立即選項關閉例程時;
 當透過設定初始化引數LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT 和FAST_START_IO_TARGET 強制時;
 當資料庫管理員手動請求時;

如果初始化引數LOG_CHECKPOINTS_TO_ALERT 設定為TRUE ,則每個檢查點資訊都記錄在ALERT 檔案內;該引數預設值為FALSE,不記錄檢查點。

注意:FAST_START_IO_TARGET 引數是在 ORACLE 8.1.x Enterprise Edition 版本及其後續版本中新增的引數。

強制檢查點
可以使用下面的SQL 命令手動強制檢查點發生:
SQL> ALTER SYSTEM CHECKPOINT;

設定資料庫檢查點時間間隔
當資料庫使用大型聯機重做日誌檔案時,可以透過設定以下初始化引數來設定其它資料庫檢查點,以改善資料庫的效能:
 LOG_CHECKPOINT_INTERVAL
 LOG_CHECKPOINT_TIMEOUT
 AST_START_IO_TARGET (只限於ORACLE 8.1.x Enterprise Edition 版本及其後續版本)

LOG_CHECKPOINT_INTERVAL
在低於ORACLE 8.1.X 的版本中,LGWR 一寫入引數LOG_CHECKPOINT_INTERVAL 指定的塊數就啟動了檢查點。LOG_CHECKPOINT_INTERVAL 值在作業系統塊中指定而不是在Oracle 資料庫塊中指定。但是,無論該值如何,當從一個聯機重做日誌檔案切換到另一個時檢查點始終發生。
如果該值超過實際聯機重做日誌檔案大小,那麼檢查點僅在日誌切換時發生。
注意:將時間間隔值指定為0 可能導致非常頻繁地啟動檢查點,因為即使上一個請求啟動後僅對單個重做日誌緩衝區寫入仍會啟動新的請求。
在ORACLE 8.1.x Enterprise Edition 版本及其後續版本內,當指定了LOG_CHECKPOINT_INTERVAL 後,檢查點位置目標相對於日誌尾的滯後不能大於該引數指定的重做日誌塊數,這確保了在例程恢復期間需要讀取不超過固定數目的重做塊。

LOG_CHECKPOINT_TIMEOUT
對於低於ORACLE 8.1 的版本,該初始化引數值指定了另一個檢查點發生前的最大時間量,該值按秒指定該時間。從前一個檢查點啟動時,開始經過該引數指定的時間量後發生另一個檢查點,將超時值指定為0 就可以禁用基於時間的檢查點。
在ORACLE 8.1.x Enterprise Edition 版本及其後續版本內,當指定了LOG_CHECKPOINT_TIMEOUT 後,該引數將檢查點位置目標設定到日誌檔案中的某個位置,而該日誌在該引數指定的秒數前結束,這確保了在恢復期間需要讀取的重做塊數不超過與指定秒數相當的塊數。

FAST_START_IO_TARGET
引數FAST_START_IO_TARGET 改善了例項失敗恢復的效能,該引數值越小,由於需要恢復的塊就越少因而恢復效能就越好。該引數設定後DBWn 更頻繁地將灰緩衝區寫出。該引數在在ORACLE 8.1.x Enterprise Edition 版本及其後續版本中引入。

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

相關文章