Oracle數(shù)據(jù)庫(kù)性能:表占用盤(pán)區(qū)解析
眾所周知,表在Oracle數(shù)據(jù)庫(kù)中占有很重要的地位,另外,碎片對(duì)于Oracle數(shù)據(jù)庫(kù)空間管理有很大的阻礙作用。同時(shí)如果段中的盤(pán)區(qū)量比較多的話,也會(huì)影響到數(shù)據(jù)庫(kù)的性能。雖然說(shuō)在 Oracle10G中采用了本地托管表空間技術(shù),已經(jīng)可以在最大程度上消除由此帶來(lái)的負(fù)面影響。但是當(dāng)數(shù)據(jù)量一大,盤(pán)區(qū)量增加,仍然會(huì)降低數(shù)據(jù)庫(kù)的查詢(xún)效率。當(dāng)數(shù)據(jù)庫(kù)管理員遇到類(lèi)似的情況時(shí),該如何處理呢?在這篇文章中,筆者主要針對(duì)這個(gè)問(wèn)題做出一些說(shuō)明,以供大家參考。
一、如何統(tǒng)計(jì)某個(gè)表所使用的盤(pán)區(qū)數(shù)量?
Oracle數(shù)據(jù)庫(kù)系統(tǒng)在分配磁盤(pán)空間的時(shí)候,往往采用的是逐筆分配的方法。如此長(zhǎng)久以往,隨著表逐漸變大,其使用的盤(pán)區(qū)數(shù)量也會(huì)隨之增加。如果在部署數(shù)據(jù)庫(kù)的時(shí)候,不能夠合理的預(yù)見(jiàn)到表的增長(zhǎng)情況,那么后續(xù)盤(pán)區(qū)數(shù)量就會(huì)非理性的增長(zhǎng)。從而最終影響到數(shù)據(jù)庫(kù)性能。為此數(shù)據(jù)庫(kù)管理員必須要對(duì)數(shù)據(jù)庫(kù)的運(yùn)行不間斷的進(jìn)行追蹤,如需要統(tǒng)計(jì)一些常用表、記錄數(shù)量比較多的表的盤(pán)區(qū)數(shù)量。
如下圖所示,這是一個(gè)ERP系統(tǒng)中產(chǎn)品信息基本表的盤(pán)區(qū)情況。據(jù)筆者了解,這家公司數(shù)據(jù)庫(kù)才用來(lái)不滿(mǎn)六個(gè)月。此時(shí)產(chǎn)品表的盤(pán)區(qū)數(shù)量已經(jīng)達(dá)到了 25。如果再過(guò)個(gè)半年,那么盤(pán)區(qū)數(shù)量就有可能突破100了。很明顯,在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,數(shù)據(jù)庫(kù)管理員沒(méi)有預(yù)料到這種情況。如果任其發(fā)展下去,其很可能會(huì)成為系統(tǒng)性能的瓶頸。故有必要對(duì)其進(jìn)行整理。
二、創(chuàng)建新表空間并將相關(guān)數(shù)據(jù)移植進(jìn)去。
當(dāng)數(shù)據(jù)庫(kù)管理員發(fā)現(xiàn)表所占用的盤(pán)區(qū)數(shù)量非常大已經(jīng)成了不爭(zhēng)的事實(shí)時(shí),需要設(shè)法對(duì)表進(jìn)行整理。一般比較推薦的做法是創(chuàng)建一個(gè)新的表空間,然后將相關(guān)的數(shù)據(jù)再移植進(jìn)去。在談具體的操作之前,筆者要強(qiáng)調(diào)一點(diǎn)。雖然數(shù)據(jù)庫(kù)允許這個(gè)事后的彌補(bǔ)措施,但是筆者并不建議經(jīng)常這么操作。筆者的意見(jiàn)是在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,就最好能夠遇見(jiàn)到表日后的增長(zhǎng)情況。如果某個(gè)表的記錄比較多、更新比較頻繁、使用也比較多的話,那么最好能夠?yàn)槠湓O(shè)置一個(gè)比較獨(dú)立的表空間或者比較高的增長(zhǎng)率。這些措施都可以在最大程度上降低日后表所占用的盤(pán)區(qū)數(shù)目,提高表的查詢(xún)效率。
第一步:創(chuàng)建一個(gè)新的表空間并創(chuàng)建一個(gè)M_PRODUCT1表。
注意筆者并不建議在已有的表空間中建立表。這主要是因?yàn)橐延械谋砜臻g中其可能已經(jīng)沒(méi)有連續(xù)的存儲(chǔ)空間了。為此不能夠確保新創(chuàng)建的表格一定具有連續(xù)的磁盤(pán)空間。筆者認(rèn)為,最好能夠再重新創(chuàng)建一個(gè)新的表空間。而且由于這張表更新頻率比較快、使用頻率也比較高,為此專(zhuān)門(mén)設(shè)置一個(gè)表空間有利于后續(xù)的維護(hù),如數(shù)據(jù)的升級(jí)、備份等等。另外需要注意的是,要為這個(gè)表空間設(shè)置一個(gè)合適的大小。一般來(lái)說(shuō),最好這個(gè)大小能夠滿(mǎn)足未來(lái)兩年的需要。這可以滿(mǎn)足未來(lái)數(shù)據(jù)增長(zhǎng)的需要。否則的話,如果每隔半年或者一年就遇到盤(pán)區(qū)數(shù)量過(guò)多的問(wèn)題,那顯然會(huì)很頭疼。
表空間創(chuàng)建完成之后,再建立一張M_PRODUCT1表。在創(chuàng)建這個(gè)表的時(shí)候,數(shù)據(jù)庫(kù)管理員可以采用Create as Select * FROM M_PRODUCT的形式來(lái)創(chuàng)建表。在創(chuàng)建表的同時(shí),將數(shù)據(jù)也導(dǎo)入到新表中,從而確保數(shù)據(jù)與數(shù)據(jù)類(lèi)型的一致。
第二步:刪除原表與表中的索引。
主要要先將原表中的索引一一刪除,然后才能夠刪除表。否則的話,系統(tǒng)會(huì)提示錯(cuò)誤信息。為了保障數(shù)據(jù)的安全,筆者強(qiáng)調(diào)一次,在操作之前最好先對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行一次完全備份。其次由于這會(huì)影響到系統(tǒng)的正常運(yùn)行,為此在操作之前最好先斷開(kāi)當(dāng)前的所有用戶(hù)。并設(shè)置為用戶(hù)不能夠訪問(wèn)。以免在操作的過(guò)程中,造成不必要的麻煩。一般建議在用戶(hù)不使用數(shù)據(jù)庫(kù)的時(shí)候,如下班后或者雙休日對(duì)其進(jìn)行操作。
第三步:重命名新表并建立索引。
將原先的表刪除之后,再將剛才新建的表格名字改成原來(lái)的表名。然后根據(jù)原先的表建立相關(guān)的索引。這里比較簡(jiǎn)便的方法是,在創(chuàng)建新表的時(shí)候就將索引也復(fù)制過(guò)去。不過(guò)索引的名字不能夠重復(fù),為此需要在原有的索引名字后面加入一個(gè)后綴。等到舊表刪除之后,再將索引的名字改回來(lái),并重新啟用。注意,如果表中的數(shù)據(jù)比較多的話,則這個(gè)重新創(chuàng)建索引的時(shí)間可能會(huì)比較長(zhǎng)。
最后筆者提醒一點(diǎn),如果客戶(hù)表增長(zhǎng)過(guò)快,可以將數(shù)據(jù)移植到一個(gè)有著更大的統(tǒng)一盤(pán)區(qū)大小的表空間里,以適應(yīng)后續(xù)表的增長(zhǎng)。當(dāng)然這是一項(xiàng)比較大的工程。雖然這需要重建相關(guān)表的索引,但是這能夠保證這個(gè)表不會(huì)從數(shù)據(jù)庫(kù)物理存儲(chǔ)中丟失。如果數(shù)據(jù)庫(kù)管理員覺(jué)得有這么操作的必要,則筆者可以提供一些加快操作的建議。如可以使用COPY命令來(lái)避免使用回滾段。或者說(shuō)使用Nologging選項(xiàng)來(lái)避免重做導(dǎo)致的時(shí)間問(wèn)題。當(dāng)記錄比較多時(shí),使用NOLOGGING 選賢能夠加速數(shù)據(jù)插入的速度。不過(guò)其也同時(shí)帶來(lái)一個(gè)缺陷,即當(dāng)出現(xiàn)問(wèn)題時(shí)不能夠進(jìn)行回滾操作。魚(yú)與熊掌不能夠兼得,最后數(shù)據(jù)庫(kù)管理員還是要在性能與安全之間進(jìn)行均衡。
通過(guò)以上這種方式來(lái)解決盤(pán)區(qū)過(guò)多的問(wèn)題,只能是不得已而為之的事情。最關(guān)鍵的還是要在數(shù)據(jù)庫(kù)設(shè)計(jì)階段,就對(duì)表的增長(zhǎng)進(jìn)行合理的預(yù)計(jì)。然后根據(jù)預(yù)計(jì)的結(jié)果對(duì)盤(pán)區(qū)空間以及表空間進(jìn)行合理的規(guī)劃。合理的規(guī)劃可以將盤(pán)區(qū)數(shù)量控制在比較小的范圍之內(nèi)。
關(guān)于Oracle數(shù)據(jù)庫(kù)中表占用盤(pán)區(qū)的講解就為大家介紹這么多,希望大家通過(guò)上文的學(xué)習(xí)之后都能夠從上文中涉及到的內(nèi)容中有所收獲。