编者按:这篇文章是我三年前的写的文章
下面是我个人的一点体会,由于水平有限,估计有理解的有一些问题,欢迎指正对于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 语句 (复制表已经存在)
create table 复制表名称 as select 语句 (复制表不存在)
·文本文件转入、转出的批量处理
·MS SQL Server
BCP命令行程序
·Oracle
SQLLDR命令行程序
11、多表更新、删除
一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表
一般形式:
·MS SQL Server
update A
SET 字段1=B表字段表达式,
字段2=B表字段表达式
from B
WHERE 逻辑表达式
·Oracle
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练
你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理
12、关于存储过程或函数中使用的临时表,两者都提供了这个功能
临时表,最主要的好处是,操作不留任何痕迹、不产生日志,
所以速度快
·MS SQL SERVER
CREATE TABLE #表名称(........) 或者 SELECT 字段表达式列表 INTO #表名称 FROM
表名称前加#即可,这些临时表都是只在一个数据库连接会话期间有效
·Oracle
create [Global] Temporary Table ,加上[Global]就是全局的临时表(所有数据库连接会话都是可见的),
不则为私有的(在一个数据库连接会话期间有效)
13、两者都提供了自己的桌面版的数据库
·MS SQL SERVER 毋庸我多说了
基本上桌面版的数据库提供的功能跟服务器版的功能没多大区别
缺少的全文搜索服务功能
·Oracle
Oracle Lite 8,我就看过人家用Oracle lite 8做过海关报关系统
补充:Sybase 提供了桌面版的Sybase SQL anywhere
14、动态执行SQL语句
·MS SQL SERVER 7.0好象没有这个功能,MS SQL SERVER 2000已经这个功能。
你是不是想在存储过程的参数中传递一个表名或者在过程体里动态
生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
·Oracle提供了两种方法实现这个功能
①程序包DBMS_SQL,执行一个语句的过程:
打开游标(open_cursor,对于非查询语句,无此过程)
分析语句(Parse)
绑定变量(bind_variable)
执行语句(execute)
关闭游标(close_cursor,对于非查询语句,无此过程)
②execute immediate ls_SQL
15、数据库备份和恢复
两者都提供了很强的数据库的备份和恢复能力,Oracle提供了更多的手段,
Orace宣称她的数据库是不可摧毁的也不是瞎吹牛
·MS SQL SERVER
①数据库的倒入倒出DTS工具,如果数据源和目的都是MS SQL SERVER则可以完全复制数库的结构
(包括表、视图、索引、触发子、规则、默认、存储过程、用户定义函数、表数据)
②数据库备份和恢复命令
backup database
restore database
倒出的数据文件还可以压缩的,这一点不同于Sybase
而且这种数据库备份和恢复的方式可以是增量的和完全的
③数据库的附加Attach
只要数据库的原始数据和日志文件没有损坏,就可以
命令:SP_ATTACH_DB
这种情况,有时候会出问题:比方说你键了登陆帐号,不是使用缺省的登陆帐号sa,
由于登陆帐号的信息存放在master数据库中,所以你使用原来建立的帐号就登陆不上,
所以要做一些后补工作
·Oracle
①倒出倒入工具exp和imp工具
倒入倒出的参数何其多
②冷备份或者称脱机备份,备份的时候数据库是停止的
备份所有的数据文件、日志文件、控制文件
③热备份或者联机备份
数据库处在ARCHIVELOG模式,注意缺省情况下都是ARCHIVELOG
恢复时可以选择完全恢复、时间点恢复、SCN点恢复、用户自由干预的CANCEL恢复
可以说他的热备份的恢复功能是非常之强大的
④RMAN恢复管理器,本人正在研究中,不好乱说