当前位置:数据库 > Oracle >>

Oracle8i与MS SQL SERVER之比较

答案:
下面是我个人的一点体会,由于水平有限,估计有理解的有一些问题,欢迎指正对于Oracle 8i初学者,很有可能会经常把MS SQL Server中的概念拿来与Oracle对照,这种对照,从我个人认为觉得不需要做过多的这种比较,一个如果才来没有学过其他数据库管理的人,可能更容易学习Oracle.现在我来说一下两者的区别和联系



1、关于数据库的概念 
我怎么找到或者创建自己的数据库
Oracle的数据库的概念已经完全不同于MS SQL

Oracle的服务和数据库,相当于MS SQL的数据库服务
Oracle的服务=后台进程+相关内存

数据库=数据文件的集合
而且Oracle的服务是完全可以与数据文件脱离开来的
那么MS SQL的数据库,在Oracle哪儿能找到呢,
Oracle的Schema,Schema的中文意思:方案,意思是一个用户所拥有所有对象的集合
这里的对象包括表、视图、实例化视图、序列、过程、函数、程序包、同义词
(下面我会详细解释这其中的一些陌生的概念)

所以我们要建立一个在Oracle中的类似于MS SQL的数据库:大致过程
·建立数据表空间(相当于MS SQL的数据库的数据文件)
·建立临时表空间(相当于MS SQL的数据库的事务日志文件)
·建立用户,他的却省表空间和临时表空间是刚建立的两个表空间
·给用户授权,最起码的角色权限是Connect 的角色
·以该用户登陆,创建自己的表、视图、实例化视图、序列、过程、函数、程序包、同义词等

2、关于Oracle Manager Server与MS SQL的Enetrprise manager
应该说这两者有很大的差别,DBA Studio工具提供了与MS SQL的Enetrprise manager同样的功用,
DBA Studio工具对一般使用来说已经足够了。
但这里有必要对Oracle Manager Server解释一下
·它是Oracle 管理分布式数据库的服务,注意他是服务
·它却省并不安装
·它需要有自己管理所需要的资料库,在某个数据库中需要建立相应的用户
·它的等录需要身份验证,注意这里的身份验证,与管理所需要的资料库的用户是不是一个概念,
也不是数据库中的Sys和、system用户,它的却省用户是oemtemp
·它的功能有
·使用它,在管理端要启动Manager Server服务和智能代理服务(OracleAgent),被管理的数据库服务器
要启动智能代理服务(OracleAgent)

3、关于Oracle 的Sys、System的用户与MS SQL的master的比较
MS SQL的master数据库存储了当前数据库服务的一些配置信息如
数据库设备(在MS SQL已经弱化)、字符集、数据文件、登陆帐号、拥有的数据库、整个服务参数配制等信息

Oracle的Sys存储Oracle服务或者实例的信息及所有用户的数据字典信息
这一点不同于MS SQL,MS SQL每一个数据库拥有自己的对象的数据字典信息
System用户拥有数据字典是视图信息,有了这些视图,我们的查询数据库的信息就特别方便
却省情况下,system用户拥有DBA系统角色权限,而sys不仅拥有DBA 的权限还拥有SysDBA的权限

DBA、SysDBA这两个系统角色有什么区别呢

在说明这一点之前我需要说一下Oracle服务的创建过程
·创建实例
·启动实例
·创建数据库(system表空间是必须的)
启动过程
·实例启动
·装载数据库
·打开数据库

SysDBA,是管理Oracle实例的,它的存在不依赖于整个数据库完全启动,
只要实例启动了,他就已经存在,以SysDBA身份登陆,装载数据库、打开数据库
只有数据库打开了,或者说整个数据库完全启动后,DBA角色才有了存在的基础!

4、Oracle中新的数据库对象:实例化视图、快照、序列、程序包、同义词、抽象的数据类型

·实例化视图又称显形图:实例化说明他有自己的存储空间,视图:说明他的数据来源于其他表数据。
实例化视图中的数据,设置为隔一段时间更新数据,更新的模式可以定义为完全更新和增量更新
·快照基本上同实例化视图,只不过数据来源不同,快照数据来愿于远程数据库,而实例化视图则来源于本地数据表
·序列,相当于MS SQL中的identity列,他是一个数字顺序列表
·程序包:他是过程、函数、全局变量的集合,他封装了私有变量、私有过程和私有函数
 如:dbms_out包
·同义词:是对数据库中的对象的别名,同义词可以是全局的也可以是私有的(属于某个用户的)
 如:Tab,col等
·抽象的数据类型,类似于C中的结构体或Pascal记录类型
关于类型,这里还有一个题外话:A Tab%RowType,这是一个特别的抽象的数据类型,该类型的分量就是TAB的字段
B Tab.TName%Type,这定义了一个和tab的字段TNAME相同的数据类型的变量,想想他有什么好处



5、Oracle数据库连接和MS SQL远程连接
两者都是为了实现分布式数据库的操作。
两者都能实现分布式事务,参见MS SQL的联机帮助

6、Oracle回滚段和MS SQL的数据库事务日志文件
  回滚段提供了事物回滚需要使用的数据变化以前的映象.这些映象是按条目存储的,
如果这些条目过少,一个事务等待另一个事务的几率增大,就会影响数据库的性能
却省安装时,提供一个系统回滚段他在System表空间.为了提高性能system 表空间
不应存储有任何数据字典信息以外的信息.

MS SQL数据库事务日志文件功能雷同于回滚段,只不过他是同特定的数据库密切相关的

7、关于数据表的管理
·超大型数据表的管理
  一个数据表,尤其是那种流水帐表,长年累月后急剧膨胀,最后影响查询性能
 怎么办,Oracle和MS SQL都提供了一种方法,把数据文件及其索引存放在一个特定的
 数据文件或表空间里,但这个还是不能解决问题,怎么办,开发人员只能给表添加
 时间的标志:如CWSJ2000(财务数据2000),CWSJ2001,CWSJ2002, 这种命名方式,
 确实能提高查询性能,但是给开发带来了不少的麻烦(浪潮财务就是这样做的),
 而且当你不知道数据在哪个表中的时候,你要联合这么表进行查询,岂不长哉!
 Oracle提供了很好的手段解决了这个问题:表及索引分区存储。按字段值的范围
 进行分区存储.具体做法不在说明。

·Oracle索引组织表和MS SQL簇索引表
 两者的数据存放顺序都是按照索引值的顺序存放的。

·无事务回滚概念的表,对这种表的操作不村在事务的概念
记得以前MySQL是不提供事务的回滚(不知现在有否变化)
而Oracle提供了建表参数nologging,使对该表的操作不参与事物的回滚

·索引
Oracle提供了多种MS SQL没有的索引类型
··位图索引,
比方说性别:仅有男女
第1条记录:男
  第2条记录:男
第3条记录:女
  第4条记录:男
  第5条记录:女
  第6条记录:男
  .........
那它的索引:110101............

看这种索引多节省空间,它适用于字段值是的已知几个中的一个

··基于函数或者说表达式的索引,这个功能可谓强大

8、外连接
·MS SQL SERVER 支持两种形式表间连接
①从Sybase继承来的形式:
字段1 *= 字段2 (左连接)
字段1 =* 字段2 (右连接)
没有这种形式的全外连接语法
②标准的外连接语法
left [outer] join on 逻辑表达式
  right [outer] join on 逻辑表达式
full [outer] join (全外连接) on 逻辑表达式
这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)

需要提醒大家的是:你写的查询语句报告过这样的错误
 Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的
 例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
  from dbo.VU_CAF_BILLS A,TU_Flag
  where A.CAF_NO*=TU_Flag.ObjNo
 视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。



·Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷
 字段1 = 字段2(+) (左连接)
字段1(+) = 字段2 (右连接)

·使用外连接语句的用处
①不想因为表连接而使主表数据行丢失,这一点毋庸多说
①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法,
使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句
而使用下面的语法:
 select TU_COMPANY.*
 from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
 where TU_Comp_Agent.Id is null

9、触发器
·从我了解到的,MS SQL SERVER,仅有表的触发器,而且触发时机不够丰富
如插入触发在子,不区分单条插入还是多条插入,也不区分插入前触发还是插入后触发
碰到多条数据的插入,需要使用游标处理每条插入的数据

·Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭
对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发
 
10、表数据复制
·库内数据复制
 ·MS SQL Server
Insert into 复制表名称 select 语句 (复制表已经存在)
  select 字段列表 into 复制表名称 from 表 (复制表不存在)
 ·Oracle
  Insert into 复制表名称 select 语句 (复制表已经存在)
  creat

上一个:Oracle数据库文件大挪移
下一个:用Oracle的热备份重建数据库

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,