首页 > 数据库 > 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的无聊和”自恋”,还是埃里克森的霸气呢?

 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表