Oracle9i與ASE12.5分別是世界主流數(shù)據(jù)庫廠商ORACLE、SYBASE公司的主打產(chǎn)品,擁有相當大的市場份額。本文拋開兩者之間在體系結(jié)構(gòu)、技術(shù)路線上的差異,純粹從使用者的角度出發(fā),整理了Oracle9i與SYBASE Adaptive Server Enterprise 12.5 (簡稱ASE12.5)相比的幾個不足,至于ASE12.5與Oracle9i相比的不足則不在本文的討論范圍。
1 不支持正則表達式:熟悉Unix/Linux及ASE12.0/12.5的人都知道正則表達式的靈活、功能強大。像“查找所有包含數(shù)字的表名稱”這樣的需求,在ASE12.5中極其簡單:
select name from sysobjects where type=”U” and name like “%[0-9]%” (這里sysobjects相當于Oracle9i中的all_objects),而Oracle9i的實現(xiàn)要頗費一番周折了,一般情況下很多人都是寫一個函數(shù)實現(xiàn),以下就是剛學Oracle的時候?qū)懙囊粋€實現(xiàn)該功能的函數(shù):
CREATE OR REPLACE function is_number(p_str in varchar2)
return number
as
? w_char char(1);
? i????? number :=1;
begin
? while? i <= length(p_str) loop
?????? w_char := substr(p_str,i,1);
?????? if w_char >='0' and w_char <='9' then
????????? return 1;
??? ???end if;
??? i:=i+1;
??? end loop;
? return 0;
end;
/
在Oracle9i調(diào)用一個自定義的PL/SQL函數(shù)開銷會很大;遠不及ASE12.5的內(nèi)部實現(xiàn)。
2? UPDATE語句的“蹩腳”,在數(shù)據(jù)庫的應用中,兩個表關聯(lián)update是很常見的,如有如下兩個表:t_a(id,name,point,…),t_b(id,point,…) id均為主鍵或unique index,現(xiàn)要實現(xiàn)根據(jù)id的對應關系將t_b表上point加至t_a表point。我們來看Oracle9i與ASE12.5的實現(xiàn):
/** For Oracle9i **/
Update t_a a
Set? ?a.point=a.point+(select b.point from t_b b where b.id=a.id)
Where exists (select 1 from from t_ b where b.id=a.id)
/
/** For ASE12.0/12.5 **/
Update t_a
Set??? point=a.point+b.point
From? t_a a,t_b b
Where? a.id=b.id
Go
Oracle9i的語句似乎不顧清晰、容易誤解,而且查看執(zhí)行計劃發(fā)現(xiàn)t_b表或索引掃描了2遍!ASE12.5只掃描了1遍。雖然第2遍是邏輯讀,但總覺得不甘心;
有時如果t_b表較小,且id上無索引,我寧愿采用cursor方式,多次試驗表明
比Create INDEX+關聯(lián)UPDATE要快得多。還有就是采用Oracle9i的OLAP特性,用merge 語句來完成。
3臨時表技術(shù)的比較:
?
ITEM
存儲位置
DDL
數(shù)據(jù)生命周期
ORACLE9i
任何表空間
用戶自己維護,表名是全局(數(shù)據(jù)庫用戶)唯一
Session / Transaction
ASE12.5
Tempdb庫
用戶create;用戶drop或系統(tǒng)drop,表名Session級唯一
Session
?
?
?
?
?
雖然兩者各有所長,但我覺得ASE12.5的實現(xiàn)似乎更得”臨時”的精髓—在每個會話期間,“召之即來”,不用擔心與別人重名,#11 #22 #aa #bb隨個人喜好創(chuàng)建,”揮之即去”, 會話結(jié)束亦不必顯式刪除,由系統(tǒng)代勞,不必擔心垃圾表存在。
?4? Count的問題還是Distinct的問題?在select 語句使用 distinct 關鍵字修飾以返回唯一的行集,這在統(tǒng)計分析、剔除重復數(shù)據(jù)尤為重要,但是有時僅想統(tǒng)計一個總數(shù)呢?我第一次是這樣寫的:
Select count(distinct a,b,c) from my_table 結(jié)果語法不對,只好修改為:
Select count(*) from ( select distinct a,b,c from my_table ) 方得以通過,心想這一定是distinct惹的禍,但隨后發(fā)現(xiàn)distinct 被冤枉了,因為即使是:
Select count(a,b,c) from my_table 也是不行的。只能寫成:
Select count(*) from ( select a,b,c from my_table )
但在ASE12.5上無論是Select count(distinct a,b,c) from my_table 還是Select count(a,b,c) from my_table 均能得出正確結(jié)果。
5? 數(shù)據(jù)導入導出工具的比較:Exp/Imp在備份和恢復方面用的比較多,且受版本(高低版本、32bit/64bit)、語言影響較大,且sqlldr 只能算作導入工具,嚴格來說Oracle9i沒有表數(shù)據(jù)的文本級的導出工具!相反,ASE12.5的bcp 的在表數(shù)據(jù)導入導出方面的很靈活,格式也很簡單,很容易做應用程序的輸入。還有視圖、存儲過程、觸發(fā)器的導出工具defncopy也很好用;至于Oracle9i,我N+1次遇到以下情況:
問:我怎么得到某個存儲過程的代碼???
答:有沒有裝client阿?
問:裝了!
答:打開Enterprise Manager Console,登錄后在方案下面找吧
……
問:怎么麻煩阿?
答:那你有沒有裝Toad或者PL/Develop阿,這些工具好用點
問:沒有??!
答:L
或者
問:我怎么得到某個存儲過程的代碼?。?br />
答:有沒有裝client阿?
問:裝了,可我在主機上??!
答:那你用sqlplus看罷,
set long 300
select text from all_source where name=’YourName’
go
問:哇,怎么麻煩阿
答:L
要是在ASE12.0
問:我怎么得到某個存儲過程的代碼啊?
答:用defncopy 吧
問:怎么用啊
答:我靠,這么簡單!你還用問阿!J
6? 聯(lián)機備份:雖然Oracle9i提供了冷、熱備份技術(shù),但是與ASE12.5基于Open Server技術(shù)的聯(lián)機實時備份Backup Server相比似乎遜色不少,將備份的介質(zhì)直接拿到另外一臺ASE12.5進行Load,很快很簡單就能獲得一個時效性極強的”鏡像”數(shù)據(jù)庫環(huán)境。而我覺得Exp/Imp比較瑣碎,且限制也較多。
Oracle9i附帶的命令行工具如sqlplus exp/imp sqlldr等,執(zhí)行時無一例外都將輸出時間、版本、版權(quán)信息,給像我這樣喜歡用shell處理結(jié)果的人來說徒增不少麻煩,相比ASE12.5的isql bcp defncopy 的干凈利落,是Oracle9i的無聊和”自戀”,還是埃里克森的霸氣呢?
只有注冊用戶登錄后才能發(fā)表評論。 | ||
![]() |
||
網(wǎng)站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關文章:
|
||
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
常用鏈接
留言簿(4)
隨筆分類(85)
隨筆檔案(89)
- 2009年8月 (1)
- 2008年7月 (1)
- 2007年11月 (1)
- 2007年8月 (1)
- 2007年7月 (2)
- 2007年6月 (1)
- 2007年2月 (5)
- 2007年1月 (1)
- 2006年12月 (1)
- 2006年11月 (1)
- 2006年10月 (11)
- 2006年9月 (28)
- 2006年8月 (9)
- 2006年7月 (12)
- 2006年6月 (3)
- 2006年5月 (1)
- 2006年4月 (3)
- 2006年3月 (4)
- 2006年2月 (3)
文章分類(14)
文章檔案(42)
- 2006年9月 (24)
- 2006年7月 (5)
- 2006年6月 (2)
- 2006年3月 (3)
- 2005年11月 (1)
- 2005年3月 (1)
- 2004年10月 (1)
- 2004年5月 (1)
- 2004年1月 (1)
- 2003年11月 (3)
收藏夾(37)
java
oracle
Sybase
搜索
積分與排名
- 積分 - 211126
- 排名 - 265
最新評論

- 1.?re: document.getElementsByName()的用法
- 455656
- --525233
- 2.?re: 討論:Java 接口當中的 “常量接口”
- 評論內(nèi)容較長,點擊標題查看
- --maaoi
- 3.?re: document.getElementsByName()的用法
- 謝謝,很明了
- --sf
- 4.?re: Ant:編寫build.xml的方法
- 學習了
- --sss
- 5.?re: Java 堆與棧的使用
-
你是個sb嗎?
- --zr