Oracle數(shù)據(jù)庫(kù)進(jìn)程之從屬進(jìn)程詳解
上次我們介紹了:Oracle數(shù)據(jù)庫(kù)進(jìn)程之后臺(tái)進(jìn)程詳解,本文我們看一下最后一類(lèi)Oracle 進(jìn)程:從屬進(jìn)程(slave process)。Oracle 中有兩類(lèi)從屬進(jìn)程:I/O 從屬進(jìn)程和并行查詢(xún)從屬進(jìn)程。接下來(lái)我們分別開(kāi)始介紹。
I/O 從屬進(jìn)程
I/O從屬進(jìn)程用于為不支持異步I/O的系統(tǒng)或設(shè)備模擬異步I/O。例如,磁帶設(shè)備(相當(dāng)慢)就不支持異步I/O。通過(guò)使用I/O 從屬進(jìn)程,可以讓磁帶機(jī)模仿通常只為磁盤(pán)驅(qū)動(dòng)器提供的功能。就好像支持真正的異步I/O 一樣,寫(xiě)設(shè)備的進(jìn)程(調(diào)用者)會(huì)收集大量數(shù)據(jù),并交由寫(xiě)入器寫(xiě)出。數(shù)據(jù)成功地寫(xiě)出時(shí),寫(xiě)入器(此時(shí)寫(xiě)入器是I/O 從屬進(jìn)程,而不是操作系統(tǒng))會(huì)通知原來(lái)的調(diào)用者,調(diào)用者則會(huì)從要寫(xiě)的數(shù)據(jù)列表中刪除這批數(shù)據(jù)。
采用這種方式,可以得到更高的吞吐量,這是因?yàn)闀?huì)由I/O 從屬進(jìn)程來(lái)等待慢速的設(shè)備,而原來(lái)的調(diào)用進(jìn)程得以脫身,可以做其他重要的工作來(lái)收集下一次要寫(xiě)的數(shù)據(jù)。
I/O 從屬進(jìn)程在Oracle 中有兩個(gè)用途。DBWn 和LGWR 可以利用I/O 從屬進(jìn)程來(lái)模擬異步I/O,另外RMAN寫(xiě)磁帶時(shí)也可能利用I/O 從屬進(jìn)程。
有兩個(gè)參數(shù)控制著I/O 從屬進(jìn)程的使用:
BACKUP_TAPE_IO_SLAVES:這個(gè)參數(shù)指定RMAN 是否使用I/O 從屬進(jìn)程將數(shù)據(jù)備份、復(fù)制或恢復(fù)到磁帶上。由于這個(gè)參數(shù)是圍繞著磁帶設(shè)備設(shè)計(jì)的,而且磁帶設(shè)備一次只能由一個(gè)進(jìn)程訪問(wèn),所以這個(gè)參數(shù)是一個(gè)布爾值,而不是所用從屬進(jìn)程的個(gè)數(shù)(這可能出乎你的意料)。RMAN 會(huì)為所用的物理設(shè)備啟動(dòng)多個(gè)必要的從屬進(jìn)程。BACKUP_TAPE_IO_SLAVES = TRUE 時(shí),則使用一個(gè)I/O 從屬進(jìn)程從磁帶設(shè)備讀寫(xiě)。如果這個(gè)參數(shù)為FALSE(默認(rèn)值),就不會(huì)使用I/O從屬進(jìn)程完成備份。相反,完成備份的專(zhuān)用服務(wù)器進(jìn)程會(huì)直接訪問(wèn)磁帶設(shè)備。
DBWR_IO_SLAVES:這個(gè)參數(shù)指定了DBW0 進(jìn)程所用I/O 從屬進(jìn)程的個(gè)數(shù)。DBW0 進(jìn)程及其從屬進(jìn)程總是將緩沖區(qū)緩存中的臟塊寫(xiě)至磁盤(pán)。這個(gè)值默認(rèn)為0,表示不使用I/O 從屬進(jìn)程。注意,如果將這個(gè)參數(shù)設(shè)置為一個(gè)非0 的值,LGWR 和ARCH 也會(huì)使用其自己的I/O 從屬進(jìn)程,LGWR 和ARCH 最多允許4 個(gè)I/O 從屬進(jìn)程。
DBWR I/O 從屬進(jìn)程的名字是I1nn,LGWRI/O 從屬進(jìn)程的名字是I2nn,這里nn 是一個(gè)數(shù)。
并行查詢(xún)從屬進(jìn)程
Oracle7.1.6 引入了并行查詢(xún)功能。這個(gè)功能是指:對(duì)于SELECT、CREATE TABLE、CREATE INDEX、UPDATE 等SQL 語(yǔ)句,創(chuàng)建一個(gè)執(zhí)行計(jì)劃,其中包含可以同時(shí)完成的多個(gè)(子)執(zhí)行計(jì)劃。將每個(gè)執(zhí)行計(jì)劃的輸出合并在一起構(gòu)成一個(gè)更大的結(jié)果。其目標(biāo)是僅用少量的時(shí)間來(lái)完成操作,這只是串行完成同一操作所需時(shí)間的一小部分。
例如,假設(shè)有一個(gè)相當(dāng)大的表,分布在10 個(gè)不同的文件上。你配置有16 個(gè)CPU,并且需要在這個(gè)表上執(zhí)行一個(gè)即席查詢(xún)。另一種方法是:可以將這個(gè)查詢(xún)計(jì)劃分解為32 個(gè)小部分,并充分地利用機(jī)器;而不是只使用一個(gè)進(jìn)程串行地讀取和處理所有數(shù)據(jù)。相比之下,前一種做法要好得多。
使用并行查詢(xún)時(shí),會(huì)看到名為Pnnn 的進(jìn)程,這些就是并行查詢(xún)從屬進(jìn)程。處理一條并行語(yǔ)句時(shí),服務(wù)器進(jìn)程則稱(chēng)為并行查詢(xún)協(xié)調(diào)器(parallelquery coordinator)。操作系統(tǒng)上服務(wù)器進(jìn)程的名字并不會(huì)改變,但是閱讀有關(guān)并行查詢(xún)的文檔時(shí),如果提到了協(xié)調(diào)器進(jìn)程,你應(yīng)該知道這就是原來(lái)的服務(wù)器進(jìn)程。
關(guān)于Oracle數(shù)據(jù)庫(kù)進(jìn)程之從屬進(jìn)程的相關(guān)知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@。
Oracle進(jìn)程系列相關(guān)文章:
Oracle數(shù)據(jù)庫(kù)進(jìn)程之服務(wù)器進(jìn)程詳解
Oracle數(shù)據(jù)庫(kù)進(jìn)程之后臺(tái)進(jìn)程詳解
【編輯推薦】