Oracle資料庫10個小問題

oncefly發表於2010-12-24

1、自增長欄位

很多人從別的資料轉來使用Oracle時,會發現Oracle的資料型別裡沒有自增長欄位型別,而像mysql,sqlserver,db2等主流資料庫都有對應的自增長欄位型別,Oracle的官方解決方案是採用sequence實現,sequence比較靈活,可以指定增長間隔等引數,雖然最終可以實現與其它資料庫一樣的效果,但是本來一個簡單的資料型別可能解決,在Oracle卻需要增加一個sequence,insert的時候還需要用sequence.nextval才行,這個地方感覺特不方便,為了相容Oracle資料庫很通用系統還不得不自己設計自增長欄位解決方案,比如增加一張專用表來儲存自增長欄位的表和欄位名,每次新增記錄時都把這個記錄值加1再取出使用。

[@more@]

2、安裝

Oracle的安裝是出名的複雜,特別是在非windows系統中,在網上可以找到遍地的Oracle安裝文件,但依然有很多人花了大量時間才安裝成功,如果要搭建rac系統,那就更復雜了。我們也看到Oracle公司也一直在降低安裝的複雜度,11g的安裝已經比8i,9i方便了一些。最讓人費解的是Oracle非要搞一個java的安裝介面,很多朋友都是因為java圖形化介面的問題安裝失敗。我想Oracle是認為java的跨平臺特性,選擇了用java開發安裝程式以統一介面,這樣也不用開發多套軟體,但是有沒有發現我們在安裝完後,伺服器上使用Oracle資料庫大部份管理都是命令列,幾乎就沒用到過圖形化介面了。 Oracle安裝其實可以做得更簡單,作業系統變數及環境變數安裝程式應該可以自動處理,軟體包依賴檢測可以人性化提示。在非windows系統上圖形化是為了更方便安裝,但是我感覺Oracle這圖形化介面如果啟動了我基本上也是點next,安裝好了,庫建好了再來修改相關引數。

3、外連線

外連線(left join ,right join,full join)在SQL標準語法中就有明確的定義,但是Oracle的語法確與標準完全不同,這個是歷史原因了,沒有左連線與右連線的概念,也不支援全外連線,Oracle語法如下所示:select * from t1,t2 where t1.id=t2.id(+)

採用(+)來表示外連線,但是大部份人第一眼會認為這是一個右連線的語法,其實在Oracle中它相當於左連線,我直到現在還有時會搞錯左右。好在Oracle9i中增加了標準外連線的語法支援。但是現在用Oracle資料庫的人SQL大部份還是採用傳統的語法,主要原因可能是傳統語法已經習慣,傳統語法更好用提示最佳化,SQL標準語法成熟度不夠且還存在一些BUG等等。

4、VARCHAR2型別

看VARCHAR2這名字,還以為有新的VARCHAR型別,其實在Oracle中就這一種變長字元型別,為什麼叫VARCHAR2我也不清楚,也許是歷史原因吧,在Oracle也可以使用VARCHAR,但是VARCHAR只是VARCHAR2的一個同義詞,而且在官方文件中還建議大家都用VARCHAR2,真是不明白了。

VARCHAR2型別的最大長度到11g中還是4000位元組,這個上限不知道為什麼這麼小,很多需求都會超過4000,只能使用lob來管理,但是Oracle的lob比較複雜,效能也不好,所以有些系統甚至在一個表建多個varcahr2(4000)的欄位來表示一個欄位的內容。而其它資料庫varchar型別的最大長度都比4000大,有8K,32K,還有64K的。

5、NUMBER型別

在10g以前NUMBER型別是Oracle唯一數值型別,可以用來表示整數和小數,範圍也足夠我們使用,Oracle也支援INTEGER語法,但是INTEGER只是NUMBER的一個同義詞,不明白Oracle為什麼沒有專用的整數型別。NUMBER型別很靈活,但是儲存空間很大,效能也不好,如果用4位元組可以表示的整數,用NUMBER平均需要6位元組儲存,如果採用number型別做指數或對數運算,與標準的浮點數效能可能會相差50倍。好在Oracle10g中增加了高效的浮點型別binary_float,binary_double,從而彌補了浮點數效能的問題。Oracle在pl/sql語法中有專用的整形pls_integer,但是pls_integer不能做為欄位的型別。

6、DATE型別

Oracle主要有兩種日期型別,date和timestamp,從詞面看以為是date表示日期,timestamp可以儲存時間,但是實際是date型別可以表示日期和時間,timestamp可以儲存更高精度的時間,為什麼date不叫datetime算了,Oracle沒有隻儲存日期的型別,如果我們的資料僅要儲存日期,那2-4個位元組就可以搞定了,但Oracle的date型別需要7個位元組儲存。

7、物化檢視

materialized view在Oracle官方文件中好像是翻譯為實體化檢視,物化檢視是國內的通用叫法。一提起檢視腦海裡立即會認為這只是檢視的一種型別,在資料庫中也只是一些定義,但是實際上materialized view與普通檢視關係不大,它更像是一個表,它是儲存了實實在在的資料,並且可以與表一樣定義儲存引數,可以與表一樣使用(select,insert,update,delete)。在其它資料庫中也有和物化檢視相似的解決方案,DB2叫物化查詢表(materialized query table),sqlserver有索引檢視,但是索引檢視僅是起最佳化作用,與oracle的物化檢視還不太一樣。

8、使用者與SCHEMA

schema的概念在很多資料庫之間都沒有統一的定位,有些資料庫可以有多個database,每個database下面有多個schema,Oracle中的schema有點怪怪的,因為Oracle只有一個database的概念,所以schema就與其它資料庫中的database有點類似,我們一般理解是schema(database)與使用者沒有直接關係,schema是邏輯概念,user是為了安全認證,只與許可權有關,但Oracle使用者與schema關係與其它資料庫不一樣,一個使用者就對應一個schema,且不能更改,而且對schema的許可權管理不方便,比如想讓某個user可以訪問另一個schema所有對像的許可權就很麻煩。這種設計也是oracle特有的,估計Oracle也不會去改變。

9、客戶端

裝個客戶端,給我個幾百M大小的軟體,有這麼複雜嗎,還有,為什麼客戶端安裝好了還要做什麼TNS配置,我直接提供資料庫連線資訊 (ip+port+dbname)不行嗎。Oracle的TNS配置確實讓開發人員頭痛了很久,特別是那種要把C/S軟體釋出給客戶端使用的場景,本來安裝客戶端就不方便,還要配置TNS,故障診斷時總是要檢查一下TNS是否配置正確,不小心選錯了TNS名連錯了資料庫導致誤刪除了資料的情況也時有發生。因為客戶端軟體的龐大,有些人還專門製做了只有幾M或幾十M的簡易客戶端安裝軟體,還有人開發了不需要客戶端的外掛,可以整合在軟體裡釋出,可見Oracle的客戶端安裝配置不是一般人能接受的。好在現在很多應用都是B/S系統了,Oracle SQL DEVELOPER也不需要配置客戶端,用jdbc連線Oracle彷彿世界清靜了許多。

10、管理及開發工具

大部份資料庫系統都會有一個比較官方全面的資料庫管理工具,尤其是微軟的產品,但是Oracle發展到現在自身的管理工具還是沒有定型,8i用企業管理器,9i用JAVA重寫了,10g用WEB重寫了,現在11g官方推薦用Oracle SQL DEVELOPER做開發,用B/S架構的OEM做管理與監控。對於Oracle官方的開發管理工具,一直認為太不專業了,遠沒有其它第三方面工具好用,plsql developer和toad應該是Oracle管理及開發人員用得最多的工具,其次就是sqlplus了。Oracle SQL DEVELOPER採用JAVA開發,很強大,可以用JDBC連線管理任何資料庫,但是還是不專業,使用起來不方便。10g的OEM有一些公司開始用了,它的監控功能應該還是不錯的,但是不能做開發管理,這個是產品定位的問題了。期待有一天Oracle能有一個像SQL SERVER那個強大的開發及管理工具。

以上說的是個人認為Oracle一些不爽的地方,從9i到11g也可以看出Oracle在增強功能以外,系統易用性,資料型別效能方面一直在改進,但是還有很多提高的空間。這些並不影響Oracle成為當前最先進的關係型資料庫系統,它的併發處理機制,鎖管理,資料字典,效能監控與統計,提供多種最佳化方法,線上管理,RAC高可用性架構等地方是其它資料庫短時還無法超越的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30745/viewspace-1043588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章