深度对比Oracle与SQL Server 联系客服

发布时间 : 星期日 文章深度对比Oracle与SQL Server更新完毕开始阅读0b7d1f64910ef12d2bf9e79f

第4条记录:男 第5条记录:女 第6条记录:男 ...……

那它的索引:110101......……

看这种索引多节省空间,它适用于字段值是的已知几个中的一个,基于函数或者说表达式的索引,这个功能可谓强大。 1.2.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

1.2.9. 触发器

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

Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭。对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发。 1.2.10. 表数据复制

库内数据复制 MS SQL Server

Insert into 复制表名称 select 语句(复制表已经存在) select 字段列表 into 复制表名称 from 表(复制表不存在) Oracle

Insert into 复制表名称 select 语句(复制表已经存在) create table 复制表名称 as select 语句(复制表不存在) 文本文件转入、转出的批量处理 MS SQL Server BCP命令行程序

2. 体系结构

2.1. 文件体系结构

ORACLE的文件体系结构: 数据文件*.DBF (真实数据) 日志文件*.RDO 控制文件*.CTL 参数文件*.ORA

SQL SERVER的文件体系结构: *.MDF (数据字典) *.NDF (数据文件) *.LDF (日志文件)

2.2. 存储结构

ORACLE存储结构:

在ORACLE里有两个块参数PCTFREE(填充因子)和PCTUSED(复用因子),可控制块确定块本身何时有,何时没有足够的空间接受新信息(对块的存储情况的分析机制)。这样可降低数据行连接与行迁移的可能性。块的大小可设置(OLTP块和DSS块)。在ORACLE中,将连续的块组成区,可动态分配区(区的分配可以是等额的也可以是自增长的)可减少空间分配次数。

在ORACLEl里表可以分为多个段,段由多个区组成,每个段可指定分配在哪个表空间里。段的类型分为:数据段、索引段、回滚段、临时段、CASH段。ORACLE里还可对表进行分区,可按照用户定义的业务规则、条件或规范,物理的分开磁盘上的数据。这样大大降低了磁盘争用的可能性。

ORACLE有七个基本表空间:

? SYSTEM表空间(存放数据字典和数据管理自身所需的信息) ? RBS回滚表空间 ? TEMP临时表空间 ? TOOLS交互式表空间 ? USERS用户默认表空间 ? INDX索引表空间 ? DBSYS福数据表空间

不同的数据分别放在不同的表空间(数据字典与真实数据分开存放),在ORACLE里基表(存储系统参数信息)是加密存储,任何人都无法访问。只能通过用户可视视图查看。

SQL SERVER 存储结构:

以页为最小分配单位,每个页为8K(不可控制,缺乏对页的存储情况的分析机制),

可将8个连续的页的组成一个?扩展?,以进一步减少分配时所耗用的资源。(分配缺乏灵活性),在SQL SERVER里数据以表的方式存放,而表是存放在数据库里。

SQL SERVER有五个基本数据库: ? master(数据字典) ? mode(存放样版) ? tempdb(临时数据库)

? msdb(存放调度信息和日志信息) ? pubs(示例数据库)

真实数据与数据字典存放在一起。对系统参数信息无安全机制。

2.3. 登入管理

ORACLE登入管理:

? SYSTEM/MANAGER (初始帐户) ? SYS/CHANGE_ON_NSTALL ? INSTALL/ORACLE(安装帐户) ? SCOTT/TIGER(示例数据库,测试用)

在ORACLE里默认只有三个系统用户,ORACLE是通过用户登入。 SQL SERVER登入管理: ? SQL SERVER身份验证 ? WINDOWS身份验证

在SQL SERVER里是通过WINDOWS用户帐户或是用SQL SERVER身份验证连接数据库的。

2.4. 区别综述

SQL不是一种语言,而是对ORACLE数据库传输指令的一种方式。SQL中NULL既不是字符也不是数字,它是缺省数据。ORACLE提供了NVL函数来解决。

ORACLE中的字符串连接为 string1 ‖ string2。SQL中为string1 + string2。

集合操作:在SQL中只有UNION(并操作)。ORACLE中包含MINUS(差操作)、 INTERECT(交操作)、UNION(并操作)。

索引:SQL的索引分为聚集索引和非聚集索引,还包括全文索引;ORACLE的索引包括:B+树索引,Bitmap位图索引,函数索引,反序索引,主键索引,散列索引,本地索引。ORACLE的数据类型比较复杂,有基本数据类型,衍生型,列对象型,表对象型,结构体型;SQL中的数据比较简单,只有一些简单的基本数据类型无法提供事务操作。