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