24周年

財(cái)稅實(shí)務(wù) 高薪就業(yè) 學(xué)歷教育
APP下載
APP下載新用戶掃碼下載
立享專屬優(yōu)惠

安卓版本:8.7.11 蘋果版本:8.7.11

開發(fā)者:北京正保會計(jì)科技有限公司

應(yīng)用涉及權(quán)限:查看權(quán)限>

APP隱私政策:查看政策>

HD版本上線:點(diǎn)擊下載>

三招讓Oracle表列管理更加簡單

來源: IT專家網(wǎng) 編輯: 2010/09/19 08:40:51  字體:

  Oracle數(shù)據(jù)庫是目前為止最復(fù)雜的一個(gè)數(shù)據(jù)庫之一。也正是這種復(fù)雜性,讓Oracle數(shù)據(jù)庫能夠面對企業(yè)各種各樣的需求。不過大部分時(shí)候,數(shù)據(jù)庫管理員掌握一些技巧,可以讓數(shù)據(jù)庫維護(hù)工作變得簡單。筆者這里就以O(shè)racle數(shù)據(jù)庫中表列的管理為例,談?wù)勥@方面的問題。

  一、把列設(shè)置為UNUSED狀態(tài),代替刪除。

  當(dāng)數(shù)據(jù)庫部署完成之后,即使在數(shù)據(jù)庫使用過程中,數(shù)據(jù)庫管理員仍然可以對數(shù)據(jù)庫的表進(jìn)行維護(hù),如刪除列等等。刪除列將刪除表中每條記錄的相應(yīng)列的值,同時(shí)釋放其所占用的存儲空間。所以如果要?jiǎng)h除一個(gè)大表中的列時(shí),由于其必須對每條記錄都進(jìn)行相應(yīng)的處理,為此這個(gè)刪除列的操作會占用比較長的時(shí)間。如有個(gè)數(shù)據(jù)庫管理員一次在設(shè)計(jì)一個(gè)人員管理系統(tǒng)時(shí),一開始是把人員的住址跟人員信息表放置同一個(gè)表中。可是后來證明這個(gè)設(shè)計(jì)是錯(cuò)誤的。一方面因?yàn)槿藛T住址的字段比較長,而且有些由于住址難以確定,這個(gè)字段還是空的。另一方面,一個(gè)人員其可能住址變更了好幾次,而出于管理的需要,又要保存起以前的住址信息。為此最后一個(gè)人員可能同時(shí)對應(yīng)多個(gè)住址信息。所以后來數(shù)據(jù)庫管理員調(diào)整了設(shè)計(jì),另外建立了一張表,然后利用人員編號把它們關(guān)聯(lián)起來。由于那時(shí)表中的紀(jì)錄已經(jīng)比較多了,如果要?jiǎng)h除列的話,那么可能這個(gè)刪除作業(yè)需要執(zhí)行時(shí)間比較長。

  為了避免在數(shù)據(jù)庫使用高峰期間由于執(zhí)行刪除列的操作而占用過多的系統(tǒng)資源(而且時(shí)間比較長),為此筆者建議不要馬上采用DROP關(guān)鍵字來刪除列。而可以先用UNUSED關(guān)鍵字把某個(gè)列設(shè)置為不活躍狀態(tài)。如可以利用命令A(yù)LTER TABLE ADRESS SET UNUSED,把某個(gè)列設(shè)置為不活躍。如此設(shè)置之后,從用戶的角度來看,被設(shè)置為UNUSED狀態(tài)的列于被直接刪除的列之間是沒有任何區(qū)別的。用戶無法通過查詢或者在數(shù)據(jù)字典中看到這些列。而且即使在表中,也可以插入相同列名的列。簡單的說,對于用戶來說,這個(gè)設(shè)置為UNUSED的列就好像刪除了一樣。但是從數(shù)據(jù)庫角度來說,在是不一樣的。其這個(gè)列只是別設(shè)置為UNUNSED列,但是在數(shù)據(jù)庫中仍然是存在的。也就是說,這個(gè)列所占用的存儲空間沒有被釋放。為此即使在數(shù)據(jù)庫運(yùn)行的高峰時(shí)期,為列加入這個(gè)標(biāo)記也不會占用多少的時(shí)間和系統(tǒng)資源。

  為此,筆者的意見是,當(dāng)數(shù)據(jù)庫比較繁忙時(shí)而且數(shù)據(jù)庫表中的紀(jì)錄又比較多,則可以不從物理上刪除這個(gè)列,而先把這個(gè)列標(biāo)記為UNUSED狀態(tài)。這可以減少因?yàn)閯h除列而給數(shù)據(jù)庫正常使用帶來的負(fù)面影響。雖然這要犧牲一點(diǎn)硬盤空間,可是現(xiàn)在硬盤便宜。為了數(shù)據(jù)庫的性能,犧牲這點(diǎn)硬盤空間是值得的。等到數(shù)據(jù)庫比較空的時(shí)候,再把這些列刪除即可。這對于用戶來說,是不會受到任何影響的。這只是在技術(shù)處理上的問題。

  為了便于管理這些UNUSED列,在Oracle數(shù)據(jù)庫中還提供了一張視圖(這張視圖的名字為USER_UNUSED_COL_TABS),幫助數(shù)據(jù)庫管理員來管理這些列。通過查詢這張視圖,數(shù)據(jù)庫管理員可以了解數(shù)據(jù)庫哪些表中存在UNUSED列。然后數(shù)據(jù)庫管理員可以根據(jù)實(shí)際情況,一個(gè)月或者一年來清除一下。這不僅可以提高數(shù)據(jù)庫的運(yùn)行效率,而且也不會因?yàn)閯h除列的操作影響到用戶的正常使用。

  二、給列表添加相關(guān)的注釋。

  俗話說,好記性不如爛筆頭。在數(shù)據(jù)庫設(shè)計(jì)的時(shí)候,給表或者列添加一些必要的注釋,可以提高其可讀性,也有利于后續(xù)的維護(hù)與升級。像筆者這種專業(yè)的數(shù)據(jù)庫設(shè)計(jì)與開發(fā)人員,往往一個(gè)人需要負(fù)責(zé)很多項(xiàng)目,即同時(shí)要負(fù)責(zé)多個(gè)企業(yè)的數(shù)據(jù)庫軟件。當(dāng)項(xiàng)目數(shù)量一多,一年后可能就不知道某個(gè)數(shù)據(jù)庫的某張表到底用來做什么用途。即使采用了比較合適的表名字編碼或者列名字編碼規(guī)則,但是憑借這些簡單的代碼,仍然不能夠直觀的反應(yīng)出這些代碼的含義。為此,在必要的時(shí)候,我們往往需要給表或者列添加相關(guān)的注釋,方便后續(xù)對其進(jìn)行維護(hù)與升級。

  為了實(shí)現(xiàn)這個(gè)目的,我們可以利用COMMENT關(guān)鍵字。如COMMENT ON TABLE 表名IS ‘注釋內(nèi)容’即可。在使用這個(gè)命令的時(shí)候需要注意的是,注釋中的內(nèi)容必須利用單引號括起來,而不是使用雙引號。因?yàn)槿绻⑨屩泻刑厥庾址脑挘鐔我?、通配符等等,最好能夠采用其他的字符代替。如果非要用這些字符的話,那么就需要采用轉(zhuǎn)義字符,讓數(shù)據(jù)庫系統(tǒng)認(rèn)為這是普通的字符。通常情況下,注釋的內(nèi)容可以多大4000個(gè)字節(jié),足夠數(shù)據(jù)庫管理員用來表述表的用途。另外在注釋的內(nèi)容中可以包含標(biāo)點(diǎn)符號、空格字符、特殊字符(不建議使用)等等。而且還可以跨越多個(gè)物理行,以提高可讀性等等。不過雖然其提供了長達(dá)4000個(gè)字節(jié)的說明,但是數(shù)據(jù)庫管理員在寫注釋的時(shí)候,最好能夠短話短說。不然的話,以后要花大量的時(shí)間來讀這些備注的內(nèi)容,可不是一件好差事。未必筆者認(rèn)為,在寫這個(gè)表注釋的時(shí)候,最好能夠點(diǎn)到為止,而不要想寫項(xiàng)目說明書那樣寫的面面俱到。

  除了給表添加注釋外,在Oracle數(shù)據(jù)庫中還可以給列添加注釋。這個(gè)添加的方法跟上面的類似,只需要把關(guān)鍵字ON TABLE更改為ON COLUMN 即可。當(dāng)有多個(gè)人共同開發(fā)一個(gè)數(shù)據(jù)庫時(shí),最好能夠在表或者列中添加必要的注釋。即使不在這里添加說明,那么在獨(dú)立的設(shè)計(jì)文檔中,也需要進(jìn)行詳細(xì)的說明。一般情況下,筆者認(rèn)為需要說明如下內(nèi)容。一是創(chuàng)建者(誰創(chuàng)建的或者誰更新的);二是創(chuàng)建的時(shí)間(什么時(shí)候創(chuàng)建或者什么時(shí)候更新的);三是需要注明創(chuàng)建或者更新的目的;四是要注明這個(gè)列的一些約束條件。另外需要注意的是,如果后來有人更新這個(gè)表或者列的時(shí)候,如調(diào)整某個(gè)字段的大小,最好不要把原先的注釋覆蓋掉。而是直接在原有的注釋后面加入新的注釋。這些措施有利于后續(xù)的維護(hù)以及數(shù)據(jù)庫的升級。

  三、重新組織表。

  有時(shí)候出于改善數(shù)據(jù)庫表的性能等目的出發(fā),需要對Oralce數(shù)據(jù)庫的表進(jìn)行重新組織。如在Oracle數(shù)據(jù)庫中,如果對表進(jìn)行頻繁的DML操作,會使得這個(gè)表產(chǎn)生比較多的空間碎片與行遷移,從而給數(shù)據(jù)庫的性能帶來負(fù)面影響。這種情況在一些事務(wù)型的數(shù)據(jù)庫中是比較常見的。此時(shí)就需要重新組織表,如可以將移動一個(gè)位置,從而減少碎片,提高數(shù)據(jù)庫的性能。

  大部分情況下,筆者都是利用ALTER TABLE MOVE語句來重新組織表。如可以利用這條語句,將某個(gè)表移動到同一個(gè)表空間的新數(shù)據(jù)段中。移動以后這對于用戶來說是沒有任何影響的。但是卻可以重建表的存儲結(jié)構(gòu),從而減少碎片,優(yōu)化性能。當(dāng)然,也可以利用這個(gè)語句把現(xiàn)有的表移動到其他的表空間中去。不過在使用這個(gè)語句的時(shí)候,數(shù)據(jù)庫管理員還是需要注意幾個(gè)限制。

  一是在使用這條語句中要注意有足夠的空閑空間;如果在同一個(gè)表空間進(jìn)行移動的話,則需要主要表空間能夠容納這個(gè)數(shù)據(jù)。這注意是因?yàn)椋@個(gè)操作就好像是兩個(gè)操作結(jié)合而完成的一項(xiàng)操作。其首先將這個(gè)表復(fù)制到指定的位置,然后再刪除原來的表。也就是說,直到表被完全移到新的數(shù)據(jù)段中之后,數(shù)據(jù)庫才會刪除原來的數(shù)據(jù)段。所以這個(gè)空閑空間一定要保證,否則的話,就可能導(dǎo)致這個(gè)作業(yè)無法順利完成。

  二是在利用這個(gè)語句重新組織表的過程中,原表的ROWID會發(fā)生改變。而這個(gè)值改變后最大的影響就會使得表中的索引失效。為此在使用這個(gè)語句重新組織表之后,就需要對此表重新建立索引。這也就是說,在短時(shí)間內(nèi)用戶使用這個(gè)表會受到一定的影響。為此在執(zhí)行這個(gè)操作的時(shí)候,最好能夠選擇數(shù)據(jù)庫比較空閑的時(shí)候。如果在執(zhí)行這個(gè)語句時(shí)能夠暫時(shí)中斷用戶的連接,那時(shí)最好的。

  數(shù)據(jù)庫管理員可以通過數(shù)據(jù)字典來查詢存儲空間的碎片狀態(tài)。如果碎片確實(shí)比較多的話,在筆者推薦使用這個(gè)語句來重新組織表,以減少碎片空間。如果整個(gè)數(shù)據(jù)庫存儲空間中都分布著大量的碎片,而不是個(gè)別表的問題,那么就需要采用數(shù)據(jù)泵工具來重新組織全部的表,在最大程度上減少碎片。

我要糾錯(cuò)】 責(zé)任編輯:zoe

實(shí)務(wù)學(xué)習(xí)指南

回到頂部
折疊
網(wǎng)站地圖

Copyright © 2000 - odtgfuq.cn All Rights Reserved. 北京正保會計(jì)科技有限公司 版權(quán)所有

京B2-20200959 京ICP備20012371號-7 出版物經(jīng)營許可證 京公網(wǎng)安備 11010802044457號