Oracle8i与MS SQL SERVER之比较
来源: 作者: 出处:综艺读书 2006-02-26下面是我个人的一点体会,由于水平有限,估计有理解的有一些问题,欢迎指正对于Oracle 8i初学者,很有可能会经常把MS SQL Server中的概念拿来与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恢复管理器,本人正在研究中,不好乱说
相关图文阅读
频道图文推荐
相关专题
·SQL Server 数据处理专题 (1439篇文章)
·SQL Server 索引和查询专题 (2633篇文章)
·SQL Server (1402篇文章)
·Oracle 10g基础应用 (4017篇文章)
·PL/SQL (402篇文章)
·SQL Server (1403篇文章)
·SQL Server 索引和查询专题 (2633篇文章)
·SQL Server (1402篇文章)
·Oracle 10g基础应用 (4017篇文章)
·PL/SQL (402篇文章)
·SQL Server (1403篇文章)
·如何使用分析函数进行行列转换 (0次浏览)
·改变非归档模式的Oracle数据库 (0次浏览)
·如何调试oracle, sql server存储过程 (0次浏览)
·oltp系统,数据块大小用4k还是8k好? (0次浏览)
·在RHEL4U4上安装Oracle10GS2 (0次浏览)
·如何在Python下连接Oracle数据库 (0次浏览)
·Oracle中对COLUMNS_UPDATED()返回值解析 (0次浏览)
·Oracle 容灾复制解决方案分析Shar Plex (0次浏览)
·简述数据库导入Oracle SQL*Loader指南 (0次浏览)
·详细解述oracle数据库九个基本操作 (0次浏览)
·改变非归档模式的Oracle数据库 (0次浏览)
·如何调试oracle, sql server存储过程 (0次浏览)
·oltp系统,数据块大小用4k还是8k好? (0次浏览)
·在RHEL4U4上安装Oracle10GS2 (0次浏览)
·如何在Python下连接Oracle数据库 (0次浏览)
·Oracle中对COLUMNS_UPDATED()返回值解析 (0次浏览)
·Oracle 容灾复制解决方案分析Shar Plex (0次浏览)
·简述数据库导入Oracle SQL*Loader指南 (0次浏览)
·详细解述oracle数据库九个基本操作 (0次浏览)
·如何使用Logmnr方法分析数据库日志 (18次浏览)
·Oracle-Decode()函数和CASE语句的比较 (18次浏览)
·Oracle9i数据挖掘介绍 (16次浏览)
·Linux 9i下Dataguard配置 (14次浏览)
·日志分析logmnr使用方法 (12次浏览)
·Oracle数据库如何查询记录时给记录加锁 (12次浏览)
·保持Oracle数据优良性能的若干诀窍 (10次浏览)
·Oracle体系框架及SQL语句性能探讨 (9次浏览)
·如何利用QCTO开发可重复使用的测试库 (8次浏览)
·理解物化视图刷新过程中出现的约束冲突 (8次浏览)
·Oracle-Decode()函数和CASE语句的比较 (18次浏览)
·Oracle9i数据挖掘介绍 (16次浏览)
·Linux 9i下Dataguard配置 (14次浏览)
·日志分析logmnr使用方法 (12次浏览)
·Oracle数据库如何查询记录时给记录加锁 (12次浏览)
·保持Oracle数据优良性能的若干诀窍 (10次浏览)
·Oracle体系框架及SQL语句性能探讨 (9次浏览)
·如何利用QCTO开发可重复使用的测试库 (8次浏览)
·理解物化视图刷新过程中出现的约束冲突 (8次浏览)
·Oracle的初学者入门心得 (588次浏览)
·Oracle SQL性能优化技巧大总结 (461次浏览)
·Oracle DBA数据库日常维护完全手册 (294次浏览)
·用ORACLE数据库存储海量图像数据 (286次浏览)
·Oracle体系结构:内存结构和进程结构 (248次浏览)
·开启企业殿堂的钥匙 Oracle服务器的安装 (185次浏览)
·将Oracle的数据导入EXCEL中的方法 (167次浏览)
·简单冷备份恢复操作步骤 (130次浏览)
·oracle下导出某用户所有表的方法 (128次浏览)
·ORACLE的客户端如何连接到数据库 (127次浏览)
·Oracle SQL性能优化技巧大总结 (461次浏览)
·Oracle DBA数据库日常维护完全手册 (294次浏览)
·用ORACLE数据库存储海量图像数据 (286次浏览)
·Oracle体系结构:内存结构和进程结构 (248次浏览)
·开启企业殿堂的钥匙 Oracle服务器的安装 (185次浏览)
·将Oracle的数据导入EXCEL中的方法 (167次浏览)
·简单冷备份恢复操作步骤 (130次浏览)
·oracle下导出某用户所有表的方法 (128次浏览)
·ORACLE的客户端如何连接到数据库 (127次浏览)
最新技术文档
·Oracle Lite 10g数据库第三版正式问世 06-25
·Oracle 动态SQL返回单条结果和结果集 06-25
·Oracle多行记录字符串综合操作几种方法 06-24
·如何通过实例配置Oracle监听器 06-24
·Oracle数据库中LONG类型字段的存取 06-24
·介绍几个基本的 SQLPLUS 命令 06-22
·与数据库无关的处理放到数据库以外来实现 06-22
·简析Oracle数据库最大可用性体系结构 06-22
·数据库开发者常犯的十大错误,你有吗? 06-21
·Oracle数据复制技术有效解决数据冗余 06-21
·Oracle 动态SQL返回单条结果和结果集 06-25
·Oracle多行记录字符串综合操作几种方法 06-24
·如何通过实例配置Oracle监听器 06-24
·Oracle数据库中LONG类型字段的存取 06-24
·介绍几个基本的 SQLPLUS 命令 06-22
·与数据库无关的处理放到数据库以外来实现 06-22
·简析Oracle数据库最大可用性体系结构 06-22
·数据库开发者常犯的十大错误,你有吗? 06-21
·Oracle数据复制技术有效解决数据冗余 06-21
站内各频道最新更新文档
站内最新制作专题
|
|||||
| ·Windows Vista ·邮件服务器专题 ·协议大全 ·数据恢复指南教程 ·FreeBSD使用教程 ·Linux数据库宝典 ·服务器存储专栏 ·Wlan组网----家庭专题 |
·综合布线工程案例 ·Linux服务器的安全性能 ·iSCSI应用与发展 ·电脑死机原因及解决办法 ·SOA 面向服务架构 ·Zope应用开发指南 ·XML详解 ·J2SE开发应用 |
||||
热门关键字导读
站内频道文章精选
| · AMD董事长年薪1610万美元 · 胡润富豪榜4位女老总遭勒索 · 爱立信中国区副总屠敏离职 |
· 绝对好使的电脑超级技巧 · 想不到浏览器还有这个功能 · 小技巧:宿舍里自娱自乐 |
| · DIY系统:打造移动Win XP · 杂牌摄像头也玩Vista · 在WinXP上运行Vista边栏 |
· 克隆软件Ghost初级使用教程 · [图解]Norton Partition · PowerPoint技巧大集合 |
| · 在VC++应用程序中读取文本 · 使用JBuilder2007开发Web.. · 熊猫烧香核心源码(Delphi) |
· 经验:ASP与存储过程解析 · 节选:快速进入AJAX开发 · Javascript+ASP作无刷新.. |
| · 在Linux 环境下安装 Mysql · Oracle在基于Window操作.. · 每天备份mysql数据的脚本 |
· Photoshop抠图:飘逸秀发.. · 告别雀斑!一个接近自然的 · 用Photoshop美化美女摄像头 |
搜索您感兴趣的内容




