国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle9i與SYBASE ASE12.5相比的幾個不足

2024-08-29 13:30:19
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,

 

 

oracle9i與sybase ase12.5相比的幾個不足

 

 

千千如夢 2004-7-24

 

 

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的無聊和”自戀”,還是埃里克森的霸氣呢?

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 咸丰县| 稷山县| 烟台市| 徐水县| 丽江市| 平湖市| 安远县| 江安县| 田林县| 乳源| 武邑县| 万盛区| 富裕县| 定兴县| 赣州市| 昌乐县| 沿河| 长春市| 永春县| 岑溪市| 台北县| 大厂| 丘北县| 老河口市| 婺源县| 邳州市| 古交市| 英山县| 建湖县| 都江堰市| 建水县| 阿合奇县| 临颍县| 攀枝花市| 玛纳斯县| 阜城县| 色达县| 蓬安县| 儋州市| 全椒县| 曲沃县|