在Oracle中存儲(chǔ)與管理大對(duì)象數(shù)據(jù)類型
在Oracle數(shù)據(jù)庫(kù)中為了更好的管理大容量的數(shù)據(jù),專門(mén)開(kāi)發(fā)了一些對(duì)應(yīng)的大對(duì)象數(shù)據(jù)類型。具體的來(lái)說(shuō),有如下幾種:
一是BLOB數(shù)據(jù)類型。它是用來(lái)存儲(chǔ)可變長(zhǎng)度的二進(jìn)制數(shù)據(jù)。由于其存儲(chǔ)的是通用的二進(jìn)制數(shù)據(jù),為此在數(shù)據(jù)庫(kù)之間或者在客戶端與服務(wù)器之間進(jìn)行傳輸?shù)臅r(shí)候,不需要進(jìn)行字符集的轉(zhuǎn)換。為此其傳輸?shù)男时容^高,而不容易出現(xiàn)亂碼現(xiàn)象。
二是CLOB數(shù)據(jù)類型。他主要是用來(lái)存儲(chǔ)可變長(zhǎng)度的字符型數(shù)據(jù),也就是其他數(shù)據(jù)庫(kù)中提到的文本型數(shù)據(jù)類型。雖然說(shuō)VARCHAR2數(shù)據(jù)類型也可以用來(lái)存儲(chǔ)可變長(zhǎng)度的字符型數(shù)據(jù),但是其容量是非常有限的。而現(xiàn)在這個(gè)CLOB數(shù)據(jù)類型,其可以存儲(chǔ)的最大數(shù)據(jù)量是4GB。而且在定義這個(gè)數(shù)據(jù)類型的時(shí)候,不需要指定最大長(zhǎng)度。在定義Varchar2數(shù)據(jù)類型時(shí)需要指定。
三是NCLOB數(shù)據(jù)類型。這個(gè)數(shù)據(jù)類型跟CLOB數(shù)據(jù)類型相似,也是用來(lái)存儲(chǔ)字符類型的數(shù)據(jù),不過(guò)其存儲(chǔ)的是Unicode字符集的字符數(shù)據(jù)。同樣,在這個(gè)數(shù)據(jù)類型中,也可以存儲(chǔ)多達(dá)4GB容量的數(shù)量,而且在定義數(shù)據(jù)類型時(shí)不需要指定長(zhǎng)度,數(shù)據(jù)庫(kù)會(huì)自動(dòng)根據(jù)存儲(chǔ)的內(nèi)容來(lái)進(jìn)行調(diào)節(jié)。
四是BFILE數(shù)據(jù)類型??纯疵志椭栏渌腖OB數(shù)據(jù)類型不同。其是在數(shù)據(jù)庫(kù)外面存儲(chǔ)的可變二進(jìn)制數(shù)據(jù),其最多也可以存儲(chǔ)4GB的數(shù)據(jù)。這里需要注意的是,在不同的操作系統(tǒng)上其存儲(chǔ)的數(shù)據(jù)容量可能是不同的。這個(gè)數(shù)據(jù)類型的特殊在于其在數(shù)據(jù)庫(kù)之外存儲(chǔ)實(shí)際數(shù)據(jù)。也就是說(shuō),跟其他大對(duì)象數(shù)據(jù)類型不同,其數(shù)據(jù)并不是存儲(chǔ)在數(shù)據(jù)文件中,而是獨(dú)立于數(shù)據(jù)文件而存在的。在這個(gè)字段中,其只存儲(chǔ)了指針信息。
二、不需要為大對(duì)象數(shù)據(jù)類型指定長(zhǎng)度。
以上提到的一些大對(duì)象數(shù)據(jù)類型有一個(gè)特點(diǎn),即全部都是可變長(zhǎng)度的數(shù)據(jù)類型,而且在定義時(shí)不需要指定其最大的長(zhǎng)度。雖然在數(shù)據(jù)庫(kù)內(nèi)建數(shù)據(jù)類型中也有一些可變長(zhǎng)度的數(shù)據(jù)類型,但是,其往往需要在定義時(shí)指定最大的長(zhǎng)度。實(shí)際存儲(chǔ)數(shù)據(jù)時(shí)不能夠超過(guò)這個(gè)長(zhǎng)度。不過(guò)這些大容量數(shù)據(jù)類型則沒(méi)有這個(gè)限制,只要在存儲(chǔ)時(shí)不要超過(guò)其最大4GB的容量限制即可。由于其都是可變長(zhǎng)度的數(shù)據(jù)類型,為此其實(shí)際存儲(chǔ)的空間為根據(jù)數(shù)據(jù)容量的大小而改變。即如果某個(gè)數(shù)據(jù)大小只有1GB,那么其實(shí)際在硬盤(pán)中存儲(chǔ)的空間就只有1GB,而不會(huì)是4GB。這就是可變長(zhǎng)度數(shù)據(jù)類型的特征。像其他的一些不可變長(zhǎng)數(shù)據(jù)類型,如果存儲(chǔ)的數(shù)據(jù)容量不夠的話,會(huì)以空格填充。不過(guò)現(xiàn)在這個(gè)大對(duì)象數(shù)據(jù)類型由于是可變長(zhǎng)度的數(shù)據(jù)類型,其實(shí)際存儲(chǔ)的長(zhǎng)度會(huì)根據(jù)世紀(jì)數(shù)據(jù)來(lái)進(jìn)行調(diào)整。為此可以最大限度的提高硬盤(pán)空間的使用率。
本文引用地址:http://cafeforensic.com/article/201706/353548.htm三、最好將大對(duì)象數(shù)據(jù)類型與普通數(shù)據(jù)類型分開(kāi)存放。
在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),如果某個(gè)表需要用到大容量數(shù)據(jù)類型,那么最好能夠?qū)⑦@些大對(duì)象數(shù)據(jù)類型的列與其它列分成獨(dú)立的表。如現(xiàn)在有一個(gè)產(chǎn)品信息表,在這個(gè)表中有一個(gè)大對(duì)象數(shù)據(jù)類型的數(shù)據(jù),用來(lái)存儲(chǔ)一段關(guān)于產(chǎn)品說(shuō)明的視頻資料。此時(shí)最好不要將這個(gè)列與產(chǎn)品信息表中的其他列存放在一起。最好是將這個(gè)大對(duì)象數(shù)據(jù)類型存放在另一張表中,然后通過(guò)產(chǎn)品ID關(guān)聯(lián)起來(lái)。這對(duì)于提高數(shù)據(jù)庫(kù)性能具有很大的幫助。如在對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份時(shí),由于對(duì)大容量的數(shù)據(jù)類型進(jìn)行備份時(shí)需要花費(fèi)比較長(zhǎng)的時(shí)間,并會(huì)在很大程度上影響數(shù)據(jù)庫(kù)的性能。而且這些大容量的數(shù)據(jù)類型一般更改也不會(huì)很頻繁。所以在備份或者還原時(shí),可以只對(duì)那些非存儲(chǔ)大對(duì)象數(shù)據(jù)類型的表空間進(jìn)行備份或者還原,從而提高數(shù)據(jù)庫(kù)備份或者還原的性能。另外一種可行的方式是,不講這些大對(duì)象信息保存在數(shù)據(jù)庫(kù)中。如對(duì)于產(chǎn)品說(shuō)明的視頻資料,只是采用不同的可變字符長(zhǎng)度數(shù)據(jù)類型,在表中存儲(chǔ)其網(wǎng)絡(luò)服務(wù)器上的路徑。然后再客戶端程序設(shè)計(jì)時(shí),設(shè)計(jì)一個(gè)連接。用戶點(diǎn)擊這個(gè)連接就可以自動(dòng)打開(kāi)網(wǎng)絡(luò)服務(wù)器上對(duì)應(yīng)的文件。這無(wú)疑也會(huì)簡(jiǎn)化數(shù)據(jù)庫(kù)的管理。所以,雖然說(shuō)Oracle數(shù)據(jù)庫(kù)提供了對(duì)大容量數(shù)據(jù)的管理能力,但是為了多方面考慮,還是能夠采取獨(dú)立管理為好,至少不要將其他的常規(guī)數(shù)據(jù)存放在同一個(gè)表或者同一個(gè)表空間中,以利于后續(xù)的管理與維護(hù)。
四、大對(duì)象數(shù)據(jù)類型在使用上的限制。
這些大對(duì)象數(shù)據(jù)類型不僅會(huì)影響Oracle數(shù)據(jù)庫(kù)的性能,而且在使用上還有不少的限制。如在某些SQL子句中不能夠使用這些數(shù)據(jù)類型。如where 是sql語(yǔ)句中最常用的條件語(yǔ)句,用來(lái)過(guò)濾數(shù)據(jù)。但是在這Where子句中,不能夠使用大對(duì)象數(shù)據(jù)類型。即不能夠根據(jù)大對(duì)象數(shù)據(jù)類型來(lái)過(guò)濾記錄,及時(shí)這個(gè)大對(duì)象數(shù)據(jù)類型可能只是存儲(chǔ)著少量的數(shù)據(jù)。故在采用大對(duì)象數(shù)據(jù)類型之前,需要了解這方面的限制。同理,還有一些子句也不支持這些大對(duì)象數(shù)據(jù)類型。如Order BY用來(lái)對(duì)某些記錄進(jìn)行排序,但是不能夠根據(jù)大對(duì)對(duì)象數(shù)據(jù)類型對(duì)記錄進(jìn)行排序,如使用Order BY CLOB語(yǔ)句,系統(tǒng)就會(huì)提醒錯(cuò)誤信息。同理,也不能夠使用Group By子句對(duì)大對(duì)象數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行分組匯總。總之,雖然說(shuō)Oracle數(shù)據(jù)庫(kù)中已經(jīng)專門(mén)為大容量數(shù)據(jù)類型提供了管理的渠道,但是支持其的語(yǔ)句還是比較少的。為此在定義大對(duì)象數(shù)據(jù)類型時(shí),要注意以后數(shù)據(jù)操作上的煩惱。
另外如果數(shù)據(jù)庫(kù)管理員習(xí)慣采用SQL*PLUS來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)以及維護(hù)數(shù)據(jù)的時(shí)候,也需要注意了。數(shù)據(jù)庫(kù)管理員是不能夠在sql *plus這個(gè)工具上進(jìn)行查詢,顯示大對(duì)象數(shù)據(jù)類型的數(shù)據(jù)。也不能夠采用INSERT語(yǔ)句插入大對(duì)象類型的數(shù)據(jù)。如果硬要這么操作的話,則數(shù)據(jù)庫(kù)系統(tǒng)會(huì)提示“列或者屬性無(wú)法通過(guò)PLUS來(lái)顯示”的錯(cuò)誤信息。所以不僅在查詢、排序上會(huì)有問(wèn)題,對(duì)大對(duì)象數(shù)據(jù)類型進(jìn)行數(shù)據(jù)插入等操作也會(huì)遇到阻礙。故雖然Oracle數(shù)據(jù)庫(kù)提供了對(duì)大對(duì)象數(shù)據(jù)類型的支持,不過(guò)筆者不是很贊成用戶將什么數(shù)據(jù)都往數(shù)據(jù)庫(kù)系統(tǒng)中存存放,特別是一些視頻資料。筆者在數(shù)據(jù)庫(kù)部署中,總是告誡用戶,能夠獨(dú)立管理這些大對(duì)象數(shù)據(jù)最好進(jìn)行獨(dú)立管理,不要放在數(shù)據(jù)庫(kù)系統(tǒng)中。如可以將他們放在網(wǎng)絡(luò)上的共享服務(wù)器中,然后通過(guò)一個(gè)地址來(lái)鏈接這些圖片或者視頻文件。如果設(shè)計(jì)的比較周到的話,在客戶端界面上設(shè)置一個(gè)超鏈接即可。通過(guò)這個(gè)超鏈接在需要的時(shí)候可以直接打開(kāi)這個(gè)文件。畢竟并不是每次用戶查詢某個(gè)產(chǎn)品信息時(shí)都需要用到這個(gè)視頻說(shuō)明文件。所以這還可以提高應(yīng)用程序的性能。因?yàn)槠淠J(rèn)情況下不會(huì)去打開(kāi)這個(gè)大容量的文件。只有在需要時(shí)用戶才會(huì)通過(guò)超鏈接來(lái)打開(kāi)。這顯然可以提高應(yīng)用程序的性能,縮短用戶的等待時(shí)間。
為此筆者建議,一般情況下只有這些大容量數(shù)據(jù)類型有同步顯示的需要,如查看某個(gè)產(chǎn)品信息時(shí),自動(dòng)在窗口中顯示這個(gè)產(chǎn)品的圖片。在這種情況下才將大對(duì)象的數(shù)據(jù)類型保存在數(shù)據(jù)庫(kù)中。除非用這個(gè)同步顯示的需要,否則的話最好不要將其存放在數(shù)據(jù)庫(kù)中。不然的話,對(duì)數(shù)據(jù)庫(kù)性能、后續(xù)維護(hù)有害無(wú)利。所以O(shè)racle提供的這些大對(duì)象數(shù)據(jù)類型只是用來(lái)應(yīng)急的,而不能夠作為常規(guī)功能來(lái)對(duì)待。
評(píng)論