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