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