時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
現(xiàn)在某家企業(yè)的Oracle數(shù)據(jù)庫(kù)中有一張產(chǎn)品信息表。這張表中的記錄已經(jīng)超過(guò)了500萬(wàn)條。其中成品信息大概30萬(wàn)條。零件記錄有300萬(wàn)條左右。剩余的都是包裝信息。數(shù)據(jù)庫(kù)工程師通過(guò)相關(guān)的分析與監(jiān)測(cè),用戶訪問(wèn)這張表的時(shí)候,會(huì)有嚴(yán)重的等待現(xiàn)象。這主要是因?yàn)檫@張表中的數(shù)據(jù)存放在同一塊硬盤上。當(dāng)不同的用戶并發(fā)訪問(wèn)這張表時(shí),會(huì)因?yàn)榇疟PI/O性能的瓶頸,而導(dǎo)致等待。如下圖所示。當(dāng)各位讀者遇到這種情況,該如何采取措施來(lái)優(yōu)化性能呢?筆者這里的建議是采用Oracle分區(qū)表減少磁盤的I/O沖突,改善數(shù)據(jù)庫(kù)的性能。
一、分區(qū)表的原理與優(yōu)勢(shì)。
分區(qū)表對(duì)于提高大表的訪問(wèn)性能會(huì)有很大的幫助。如上圖所示,可以將一張產(chǎn)品信息表分按產(chǎn)品類別分為三個(gè)部分,分別為成品信息、零件信息和原材料信息。然后將這三部分對(duì)應(yīng)一個(gè)單獨(dú)的分區(qū),并將它們存放在不同的硬盤上。此時(shí)當(dāng)不同的用戶訪問(wèn)不同的信息時(shí),就可以有效的降低磁盤的I/O沖突。即使是同一個(gè)用戶,需要同時(shí)訪問(wèn)這三部分信息,如產(chǎn)品的物料清單時(shí),由于其分別從不同的硬盤中讀取數(shù)據(jù),為此也可以明顯的降低磁盤I/O沖突。
所以分區(qū)的基本原理就是通過(guò)訪問(wèn)一個(gè)表或者索引的較小片斷,而不是訪問(wèn)整個(gè)表和索引,以提高數(shù)據(jù)庫(kù)的性能。當(dāng)然這有一個(gè)前提條件,需要將一個(gè)表的不同分區(qū)放置在不同的磁盤上,此時(shí)磁盤整體的吞吐量就會(huì)成倍上升。
采取分區(qū),不僅可以提高用戶訪問(wèn)時(shí)的性能,而且還可以提高備份時(shí)的靈活性。如上面這個(gè)例子,將產(chǎn)品信息根據(jù)其類別分為不同的區(qū),并將它們保存在不同的硬盤上。此時(shí)就可以對(duì)各自的分區(qū)進(jìn)行單獨(dú)的備份。如最近因?yàn)閲?guó)家環(huán)保的要求,原材料信息進(jìn)行了大規(guī)模的調(diào)整。此時(shí)就可以對(duì)原材料信息所在的分區(qū)數(shù)據(jù)進(jìn)行單獨(dú)的備份。這不僅可以減少備份的時(shí)間,而且可以降低備份作業(yè)過(guò)程中出現(xiàn)的I/O沖突問(wèn)題。
一般來(lái)說(shuō),分區(qū)表的優(yōu)勢(shì)有一個(gè)前提,就是需要將分區(qū)數(shù)據(jù)放置在不同的磁盤上。如果不這么做的話,那么分區(qū)往往很難起到降低磁盤I/O的效果。所以為了最大程度的降低一個(gè)大表的磁盤I/O(特別是經(jīng)常會(huì)有并發(fā)行的訪問(wèn)),此時(shí)應(yīng)該將表分割到多個(gè)分區(qū)上。然后再將這些分區(qū)存放在不同的磁盤上。
二、分區(qū)表模式的選擇。
那么該如何對(duì)表進(jìn)行分區(qū)呢?這又是一個(gè)比較關(guān)鍵的問(wèn)題。根據(jù)經(jīng)驗(yàn),筆者認(rèn)為要讓分區(qū)取得更好的效果,分區(qū)表模式的選擇至關(guān)重要。也就是說(shuō),按什么內(nèi)容對(duì)表進(jìn)行分區(qū)管理。有時(shí)候,先同的數(shù)據(jù),采取不同的分區(qū)表模式,往往會(huì)有不同的效果。在下面的內(nèi)容中,筆者會(huì)結(jié)合企業(yè)實(shí)際應(yīng)用的情景,對(duì)分區(qū)表模式的選擇進(jìn)行舉例。希望這些內(nèi)容能夠幫助各位讀者,更好的維護(hù)分區(qū)表。
第一種模式:按行來(lái)進(jìn)行分區(qū)。
上面這個(gè)例子中,筆者談到有一張產(chǎn)品信息表,其包括成品信息、零件信息和原材料信息。當(dāng)這張表的記錄比較多,并且當(dāng)用戶訪問(wèn)這張表時(shí)已經(jīng)出現(xiàn)了嚴(yán)重的I/O沖突的時(shí)候,則就可以根據(jù)行記錄來(lái)進(jìn)行分區(qū)。如在產(chǎn)品信息表中有一個(gè)產(chǎn)品類別的字段。數(shù)據(jù)庫(kù)管理員就可以根據(jù)這個(gè)字段對(duì)標(biāo)進(jìn)行分區(qū)。具體的分區(qū)方法也比較簡(jiǎn)單。在建立表的時(shí)候,在產(chǎn)品類別字段后加上Partion關(guān)鍵字,然后指定按字段的內(nèi)容進(jìn)行分區(qū)。這個(gè)操作比較簡(jiǎn)單,筆者就不過(guò)多展開(kāi)了。筆者這里需要強(qiáng)調(diào)的是,分區(qū)完之后一定要將數(shù)據(jù)存放在不同的磁盤上,即不同的表空間。否則的話,不能夠起到改善磁盤I/O的效果。
第二種模式:按列來(lái)進(jìn)行分區(qū)。
在實(shí)際工作中,還有這么一種情況。如現(xiàn)在有一張員工信息表。這這張表中除了包含員工的基本信息,如身份證號(hào)碼、姓名、籍貫等內(nèi)容,還包括員工的身份證復(fù)印件或者照片等圖片信息。大家都知道,圖片信息的數(shù)據(jù)流量是很大的。有可能一張身份證復(fù)印件的數(shù)據(jù)流量相當(dāng)于幾千條的員工基本信息。而且,當(dāng)用戶訪問(wèn)員工信息表的時(shí)候,并不是每個(gè)時(shí)候都需要查看身份證復(fù)印件。大部分時(shí)候他們可能只是查詢員工的聯(lián)系方式或者住址等等。另外,一般身份證復(fù)印件等照片不會(huì)隨意更改,而員工的聯(lián)系方式或這住址等等,則更改比較頻繁。此時(shí)如果需要更改員工信息,卻將不需要更改的員工身份證復(fù)印件也查詢出來(lái),顯然那這會(huì)加重磁盤的I/O沖突。
當(dāng)企業(yè)存在這種情況時(shí),也可以對(duì)這個(gè)表進(jìn)行分區(qū)。此時(shí)分區(qū)并不是對(duì)行進(jìn)行分區(qū),而是對(duì)列進(jìn)行分區(qū)。如可以將身份證復(fù)印件信息或者照片信息分為一個(gè)獨(dú)立的分區(qū),并將其保存在另外一個(gè)硬盤上。這么做,能夠帶來(lái)如下的好處。
一是在數(shù)據(jù)訪問(wèn)時(shí),可以指定是否需要查詢身份證信息所在的分區(qū)。在查詢員工信息的時(shí)候,在語(yǔ)句中可以指定從哪個(gè)分區(qū)中查詢信息。當(dāng)用戶平時(shí)只是查詢員工的聯(lián)系方式或者住址時(shí),就不需要訪問(wèn)身份證復(fù)印件所在的分區(qū)。如可以使用如下語(yǔ)句查詢:
Select * from ad_user partition(uinfo) –假設(shè)員工的基本信息存放在分區(qū)Unifo中。
在查詢語(yǔ)句中,使用Partition關(guān)鍵字可以指定其查詢的是哪個(gè)分區(qū)。如果不特指的話,則系統(tǒng)會(huì)查詢這個(gè)表所對(duì)應(yīng)的全部分區(qū)。而指定的話,就只訪問(wèn)某個(gè)特定分區(qū)的內(nèi)容。上面這條語(yǔ)句,就只讀取Uinfo分區(qū)中的信息。而不會(huì)讀取身份證復(fù)印件等相關(guān)信息。如此的話,就可以降低磁盤的I/O沖突,減少不必要的數(shù)據(jù)流量,提高查詢的性能。
二是方便對(duì)數(shù)據(jù)的備份。根據(jù)使用習(xí)慣,一般身份證復(fù)印件或者員工照片等信息不怎么會(huì)更改。為此對(duì)這些數(shù)據(jù)的備份頻率可以比較低一點(diǎn)。況且這些信息的容量往往會(huì)很大。如果經(jīng)常對(duì)其進(jìn)行備份,顯然會(huì)增加磁盤的I/O負(fù)擔(dān)。而對(duì)于員工的聯(lián)系信息或者住址等等,其變化的頻率就會(huì)高許多。對(duì)這些信息就需要進(jìn)行經(jīng)常性的備份。對(duì)大表進(jìn)行分區(qū)管理,還有一個(gè)很大的優(yōu)勢(shì)就在于可以對(duì)各個(gè)分區(qū)中的數(shù)據(jù)采取獨(dú)立的備份。為此就可以對(duì)身份證復(fù)印件所在的分區(qū)進(jìn)行單獨(dú)的備份,如一個(gè)月或者有大的變動(dòng)時(shí)進(jìn)行備份。而對(duì)于其他的信息則可以每天進(jìn)行備份。這就可以實(shí)現(xiàn)在性能與安全方面的均衡。一般來(lái)說(shuō),在訪問(wèn)某個(gè)表時(shí),如果經(jīng)常需要訪問(wèn)的信息只是特定的幾列,而不需要訪問(wèn)的信息容量比較大,此時(shí)就可以采用按列分區(qū)的模式。在這種情況下,用戶就可以在查看某個(gè)分區(qū)內(nèi)容的時(shí)候避免訪問(wèn)其他分區(qū)。同時(shí)還可以在不妨礙其它分區(qū)的情況下對(duì)某個(gè)分區(qū)的數(shù)據(jù)進(jìn)行獨(dú)立的備份。
第三種分區(qū)模式:散列分區(qū)。
有時(shí)候某個(gè)表可能沒(méi)有明顯的分區(qū)特征,即不符合上面提到的這些情況。但是表中的記錄又非常的多。在這種情況下,也有必要進(jìn)行分區(qū)。不過(guò)此時(shí)我們可以讓系統(tǒng)進(jìn)行隨機(jī)的分區(qū)。這種分區(qū)模式就叫做散列分區(qū)。通常情況下,為了提高散列分區(qū)的效果,即得到一個(gè)比較均勻的分布,往往可以將2的N次方指定為散列分區(qū)數(shù)。一般來(lái)說(shuō),N越大,其分布的越均勻。
也就是說(shuō),當(dāng)數(shù)據(jù)庫(kù)管理員不知道該如何對(duì)表進(jìn)行分區(qū)時(shí),但確實(shí)有分區(qū)的必要時(shí),可以使用散列分區(qū)。不過(guò)筆者需要提醒的是,散列分區(qū)其有一個(gè)重大的限制。在使用散列分區(qū)的時(shí)候,僅僅支持本地索引,而不支持其他的索引方式。這一點(diǎn)需要特別的注意。在實(shí)際工作中不能夠因?yàn)椴扇×松⒘蟹謪^(qū),而降低或者取消了索引。這往往是得不償失的,不可行。
關(guān)鍵詞標(biāo)簽:Oracle
相關(guān)閱讀
熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法