posts - 89,  comments - 98,  trackbacks - 0
          Oracle9i與ASE12.5分別是世界主流數據庫廠商ORACLE、SYBASE公司的主打產品,擁有相當大的市場份額。本文拋開兩者之間在體系結構、技術路線上的差異,純粹從使用者的角度出發,整理了Oracle9i與SYBASE Adaptive Server Enterprise 12.5 (簡稱ASE12.5)相比的幾個不足,至于ASE12.5與Oracle9i相比的不足則不在本文的討論范圍。

          1 不支持正則表達式:熟悉Unix/Linux及ASE12.0/12.5的人都知道正則表達式的靈活、功能強大。像“查找所有包含數字的表名稱”這樣的需求,在ASE12.5中極其簡單:

          select name from sysobjects where type=”U” and name like “%[0-9]%” (這里sysobjects相當于Oracle9i中的all_objects),而Oracle9i的實現要頗費一番周折了,一般情況下很多人都是寫一個函數實現,以下就是剛學Oracle的時候寫的一個實現該功能的函數:

          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調用一個自定義的PL/SQL函數開銷會很大;遠不及ASE12.5的內部實現。

          2? UPDATE語句的“蹩腳”,在數據庫的應用中,兩個表關聯update是很常見的,如有如下兩個表:t_a(id,name,point,…),t_b(id,point,…) id均為主鍵或unique index,現要實現根據id的對應關系將t_b表上point加至t_a表point。我們來看Oracle9i與ASE12.5的實現:

          /** 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的語句似乎不顧清晰、容易誤解,而且查看執行計劃發現t_b表或索引掃描了2遍!ASE12.5只掃描了1遍。雖然第2遍是邏輯讀,但總覺得不甘心;

          有時如果t_b表較小,且id上無索引,我寧愿采用cursor方式,多次試驗表明

          比Create INDEX+關聯UPDATE要快得多。還有就是采用Oracle9i的OLAP特性,用merge 語句來完成。

          3臨時表技術的比較:

          ?

          ITEM

          存儲位置

          DDL

          數據生命周期

          ORACLE9i

          任何表空間

          用戶自己維護,表名是全局(數據庫用戶)唯一

          Session / Transaction

          ASE12.5

          Tempdb庫

          用戶create;用戶drop或系統drop,表名Session級唯一

          Session

          ?

          ?

          ?

          ?

          ?

          雖然兩者各有所長,但我覺得ASE12.5的實現似乎更得”臨時”的精髓—在每個會話期間,“召之即來”,不用擔心與別人重名,#11 #22 #aa #bb隨個人喜好創建,”揮之即去”, 會話結束亦不必顯式刪除,由系統代勞,不必擔心垃圾表存在。

          ?4? Count的問題還是Distinct的問題?在select 語句使用 distinct 關鍵字修飾以返回唯一的行集,這在統計分析、剔除重復數據尤為重要,但是有時僅想統計一個總數呢?我第一次是這樣寫的:

          Select count(distinct a,b,c) from my_table 結果語法不對,只好修改為:

          Select count(*) from ( select distinct a,b,c from my_table ) 方得以通過,心想這一定是distinct惹的禍,但隨后發現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 均能得出正確結果。

          5? 數據導入導出工具的比較:Exp/Imp在備份和恢復方面用的比較多,且受版本(高低版本、32bit/64bit)、語言影響較大,且sqlldr 只能算作導入工具,嚴格來說Oracle9i沒有表數據的文本級的導出工具!相反,ASE12.5的bcp 的在表數據導入導出方面的很靈活,格式也很簡單,很容易做應用程序的輸入。還有視圖、存儲過程、觸發器的導出工具defncopy也很好用;至于Oracle9i,我N+1次遇到以下情況:

          問:我怎么得到某個存儲過程的代碼啊?

          答:有沒有裝client阿?

          問:裝了!

          答:打開Enterprise Manager Console,登錄后在方案下面找吧

          ……

          問:怎么麻煩阿?

          答:那你有沒有裝Toad或者PL/Develop阿,這些工具好用點

          問:沒有啊!

          答:L

          或者

          問:我怎么得到某個存儲過程的代碼啊?

          答:有沒有裝client阿?

          問:裝了,可我在主機上啊!

          答:那你用sqlplus看罷,

          set long 300

          select text from all_source where name=’YourName’

          go

          問:哇,怎么麻煩阿

          答:L

          要是在ASE12.0

          問:我怎么得到某個存儲過程的代碼啊?

          答:用defncopy 吧

          問:怎么用啊

          答:我靠,這么簡單!你還用問阿!J

          6? 聯機備份:雖然Oracle9i提供了冷、熱備份技術,但是與ASE12.5基于Open Server技術的聯機實時備份Backup Server相比似乎遜色不少,將備份的介質直接拿到另外一臺ASE12.5進行Load,很快很簡單就能獲得一個時效性極強的”鏡像”數據庫環境。而我覺得Exp/Imp比較瑣碎,且限制也較多。

          Oracle9i附帶的命令行工具如sqlplus exp/imp sqlldr等,執行時無一例外都將輸出時間、版本、版權信息,給像我這樣喜歡用shell處理結果的人來說徒增不少麻煩,相比ASE12.5的isql bcp defncopy 的干凈利落,是Oracle9i的無聊和”自戀”,還是埃里克森的霸氣呢?
          posted on 2006-09-20 11:51 水煮三國 閱讀(341) 評論(0)  編輯  收藏 所屬分類: Sybase
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(4)

          隨筆分類(85)

          隨筆檔案(89)

          文章分類(14)

          文章檔案(42)

          收藏夾(37)

          java

          oracle

          Sybase

          搜索

          •  

          積分與排名

          • 積分 - 211659
          • 排名 - 266

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 商洛市| 通榆县| 巨鹿县| 邯郸市| 伊川县| 茶陵县| 乌拉特前旗| 阿坝| 新巴尔虎右旗| 苍梧县| 永寿县| 崇文区| 会昌县| 宿州市| 新乡市| 宜阳县| 梁山县| 黔西县| 出国| 常熟市| 滁州市| 搜索| 玛曲县| 中宁县| 石阡县| 慈溪市| 如东县| 布尔津县| 丁青县| 改则县| 龙海市| 南皮县| 拉孜县| 金坛市| 旬邑县| 峨山| 海宁市| 嘉黎县| 高碑店市| 乐平市| 湄潭县|