•1 SQL Server与Oracle不同之处
•1.1 开放性
- SQL Server
只能在Windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且Windows平台的可靠性,安全性和伸缩性是非常有限的。它不象Unix那样久经考验,尤其是在处理大数据量的关键业务时。
- Oracle
能在所有主流平台上运行(包括 Windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。由于本身Oracle是用JAVA写的,因此在开放系统互连及各种平台下都有很好的支持。
•1.2 安全性
- SQL server
没有获得任何安全证书。 - Oracle Server
获得最高认证级别的ISO标准认证。而且Oracle可以跨平台进行应用,结合其它操作系统(如Unix、Linux等)安全性更高。
•1.3 性能
购买一个产品,首先考虑的当然是产品的性能了,当考虑性能的同时当然少不了究竟要花多少钱在这产品也是个很关键的问题。要建立并运行一个数据库系统。不仅仅包含最初购置软件、硬件的费用,还包含了培训及以后维护的费用。Orcale数据库的价格是远比SQL Server数据库要高,为什么Oracle数据库比SQL Server数据库价格上要高出那么多,一方面Oracle的初始花费相对较高,特别是在考虑工具软件的时候,Oracle很多工具软件需要另外购买,与 Microsoft提供免费的SQL Server工具软件相比,Oracle更显价格的不菲。但由于SQL Server只能在Windows下运行的原因,普遍认为SQL Server数据库的可靠性是比较差的。Oracle的性能优势体现在他的多用户上,而SQL Server的性能优势在多用户上就显得力不从心了。
- SQL Server
多用户时性能不佳, C/S结构,只支持Windows客户,可以用ADO,DAO,OLEDB,ODBC连接。多用户下特别是并发连接数多的情况下支持不好。
- Oracle
性能最高,保持WindowsNT下的TPC-D和TPC-C的世界记录。多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接。由于Orackle大型数据仓库方面特别是海量存储方面的优化技术,使得它在这一方面的优势特别明显。支持在数据量的并发请求,多用户实时海量查询。
•1.4 操作性方面
操作上SQL Server明显要比Orcale简单,如果你用过Java和DOTNET的开发平台,区别的基本就是Oracle和SQL Server不同,Oracle的界面基本是基于Java的,大部分的工具是Dos界面的,甚至SQLPlus也是, SQL Server是跟VB一样,全图形界面,很少见到DOS窗口。SQL Server中的企业管理器给用户提供一个全图形界面的集成管理控制台来集中管理多个服务器。Oracle也有自己的企业管理器,而且它的性能在某些方面甚至超过了SQL Server的企业管理器,但它安装较为困难。
- SQL Server
操作简单,但只有图形界面。
- Oracle
较复杂, 同时提供GUI和命令行,在Windows NT和Unix下操作相同,需要对JAVA有一定的了解程度。
•1.5 使用风险
- SQL Server
完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。
- Oracle
长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。
•1.6 体系结构
•1.6.1 数据库存储结构
SQl server在逻辑存储方式上是把表存在数据库上。Oracle是把表存储在表空间上,表空间上再划分为Segment、Segment又分为 extent,Extent分为Blocks。这样一层层地对数据库进行细分。在物理上SQl server是以数据文件加日志文件的形式存放在磁盘上,Oracle是以表空间的形式, 一个表空间可以有多个数据文件,另外还有日志文件、参数文件、网络配置文件、控制文件等组成,从结构体系上来说要复杂的得多。
•1.6.2 内存结构
- Oracle
Oracle内存可以分为系统全局区(SGA)、程序全局区(PGA)、排序区(Sort area)。SGA按其作用不同又可分为:数据缓冲区、日志缓冲区、共享池。
1. 数据缓冲区
数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改、插入的数据存储在数据缓冲区中,修改完成
或DBWR进程执行时,数据被写入数据文件。对于缓冲区中已经被修改但尚未写入文件的数据,我们称之为"脏数据"。Oracle采用LRU(最近最少用)算法来管理数据缓冲区中的数据。
2. 日志缓冲区
日志缓冲区用于缓冲事务日志,在适当的时候再由LGWR进程写入日志文件。日志缓冲区的大小由参数LOG_BUGGER设定。
另外,日志缓冲区里还有Redo、Undo两种结构,从而保护事务的完整性和一致性。
3. 共享池
共享池是对sql,pl/sql程序进行语法分析,编译,执行的内存区域。包括:库缓冲区(library cache),数据字典缓冲区
(data dictinary cache),用户全局区 UGA(user global area)三个部分。
- SQl Server
没有这么详细的划分
•1.7 价格
- SQL Server
投入不大
- Oracle
高额的费用,以及其它一些支持企业级管理开发的组件(需另付费)
•1.8 其它特性
•1.8.1 数据类型
在变量声明方式方面,Oracle可以说非常创建,既可以声明Type类型、ref cursor、Record类型、Array等,也同样支持所有的标准数据类型,包括Number、Varchar2、Varchar2。同时支持对象名%type的声明方式,如:
声明方式:变量名 对象名%type
这里的变量类型可以是所有以存在的数据类型,具有依赖性 ,存储过程中用这种变量比较灵活,但效率应该会低些,可以声明一个跟数据类型相同的数据类型,或者声明一个%Rowtype类型。
oracle存储过程中借助cursor类型变量返回并访问记录集 sql server中只能通过ADO把Reset对象返回。
- 1.1 SQL Server
只支持一般的数据类型,如char、Number,不支持大对象类型,但它有一种复杂类型,即OleDB。
- 1.2 Oracle
支持所有的数据类型,包括大对象(CLOB、BLOB、LONG等),另外还支持三种复合类型
1、 索引表
2、 嵌套表
3、 数组
•1.8.2 语法方面
基本的语法都一样,都是基于SQL标准的,不同的是Oracle在编程方面的能力要远远超过SQL Server,比如Orace里有优化器模式、Hints等可在语句级对SQL进行调整。Oracle本身通过Java编写,完全遵照面向的面向对象的模式,所以写起语句来特别是Pl/sql(Oracle的一种SQL编程语言)感觉很清晰,很多都是以对象的方面进行存取。另外,由于Oracle中对 DSS系统的全面支持,它在基于OLAP方面有有很强的功能,特别是以后如果是往数据仓库上面进行调整与优化的话,Oracle绝对是最好的选择。
•1.8.3 开发方面
•1.8.3.1 数据并行访问方式
数据库并行访问,也就是两个或两以上用户同时访问同一数据,这也是数据库引擎如何设计和实现适度反应所面临的最大问题。设计优良、性能卓越的数据库引擎可以轻松地同时为成千上万的用户服务。而"底气不足"的数据库系统随着更多的用户同时访问系统将大大降低其性能。最糟糕的情况下甚至可能导致系统的崩溃。
当然,并行访问是任何数据库解决方案都最为重视的问题了,为了解决并行访问方面的问题各类数据库系统提出了各种各样的方案。 SQL Server和Oracle两大DBMS也分别采用了不同的并行处理方法。它们之间的实质差别在哪里呢?
并行访问的问题
并行访问出现问题存在若干种情况。在最简单的情形下,数量超过一个的用户可能同时查询同一数据。就这种情况而言数据库的操作目标很简单:尽可能地为用户们提供快速的数据访问。 这对我们现在常见的数据库来说不成问题:SQL Server和 Oracle 都采用了多线程机制,它们当然能够一次处理多个请求。
不过,在用户修改数据的情况下并行访问问题就变得复杂起来了。显然,数据库通常只允许唯一用户一次修改特定的数据。当某一用户开始修改某块数据时, SQL Server和 Oracle 都能很快地锁定数据,阻止其他用户对这块数据进行更新,直到修改该数据的第1位用户完成其操作并提交交易(commit transaction)。但是,当某一位用户正在修改某块数据时假设另一位用户又正想查询该数据的信息时会发生什么情况呢?在这种情况下数据库管理系统又该如何动作呢?
Oracle 和 SQL Server针对这一问题采取了不同的解决方案。
SQL Server方法
现在不妨假设有人开始修改SQL Server上存储的数据,于是这块数据立即被数据库锁定。数据锁定操作阻塞其他任何访问该数据的连接--连查询操作都不会放过。于是,这块被锁定的数据只有在交易被提交或者回滚之后才能接受其他访问操作。
我们可以在Query Analyzer内打开两个窗口。在第1个窗口中执行一个更新操作语句,更新pubs数据库中某一图书的价格:
use pubs
go
begin tran
update titles
set price = price * 1.05
where
title_id = 'BU2075'
由于代码中并没有执行commit语句,所以数据变动操作实际上还没有最终完成。接下来,在另一个窗口里执行查询语句,你什么结果也得不到。窗口底部的小地球图标会转个不停。尽管我在先前的操作中仅仅更新了一行,但是,select语句的执行对象却恰好包含了其数据正被修改的一行。因此,上面的操作不会返回任何数据,除非回到第1个窗口提交交易或者回滚。
SQL Server的数据锁定方案可能会降低系统的性能和效率。数据被锁定的时间越长,或者锁定的数据量越大,其他数据访问用户就越可能不得不等待其查询语句的执行。因此,从程序员的角度来看,对SQL Server编程的时候应该尽量地把交易代码设计得既小又快,也就是所操作的事务要尽可能小,另外由于SQl Server中事务是隐式Commit的,对于数据的安全性来说也不好。
Oracle方法
下面我们再看看Oracle数据库是如何实施类似操作的。首先,我打开一个SQLPlus实例执行下列查询语句(这个例子可以
在Oracle 9i中示例中找到)。这个实例称做查询实例:
select first_name, last_name, salary
from hr.employees
where
department_id = 20;
代码返回两行数据,然后,再打开另一个SQLPlus实例--更新实例来执行以下命令:
SQL> update hr.employees
2 set salary = salary * 1.05
3 where
4 department_id = 20
5
代码执行后回复消息称两行数据已被更新。
注意: 以上代码中并每有像在SQL Server示例那样键入"begin tran"字样的代码。Oracle 的SQLPlus隐含启用交易(你还
可以模仿SQL Server的行为,设置"autocommit to on"自动地提交交易)。接下来我们在SQLPlus更新实例中再执行同查询实
例一样的select语句。
结果清楚地表明:Michael和Pat的薪水都增加了,然而这个时候我还没有提交数据变更交易。Oracle不需要用户等待数据更新实例中操作被提交,它径直返回Michael和Pat的查询信息,但实际上返回的是数据更新开始之前的数据视图!
这时候,熟悉SQL Server的人可能会说了,在查询中设置(NOLOCK)不也能达到同样的效果吗?可是,对SQL Server而言,在数据映像之前是不能获取数据的。指定(NOLOCK)实际上只是得到了没有提交的数据。Oracle的方法则提供了数据的一致视图,所有的信息都是针对交易的、基于存储数据快照的。如果在SQLPlus的更新实例中提交更新交易在查询实例中就能看到薪水数据发生变化。如果在查询实例中重新运行先前的查询语句,那么Oracle将返回新的薪水数值。
- 1.3 SQL Server
没有游标共享、批绑定的概念,只能写SQL,查询分析器进行硬解析,这样一旦应用业务量上来,在SQL语句这一级肯定是个负担,因为它不能进行绑定变量,每次都是重新取一次。
- 1.4 Oracle
Oracle里对性能在开发方面的影响有很多,包括在SQL语句使用批绑定、批联编、游标共享、查询重写等很多方式,可以在数据库开发上对SQ语句进行极大提升。它还有很多种hints操作、优化模式、调优参数等。非常强大。
•1.8.3.2 并行执行
Oracle有一个很棒的特性,称为并行执行(parallel execution)。
所谓并行执行,是指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。Oracle中的并行执行正是模拟了我们在实际生活中经常见到的并发处理。例如铺设管线和电路配线就可以同时进行,以减少整个工作所需的总时间。
在一个数据仓库/决策支持环境中,会频繁地使用并行查询,因此,诸如并行索引区间扫描或并行快速全面索引扫描等操作不仅很有意义,而且对我们很有好处。我们希望充分地使用所有可用的资源,并行查询就提供了这样的一种途径。因此,在数据仓库环境中,分区就意味着很有可能会加快处理速度。
Oracle 中的并行执行遵循了几乎相同的逻辑,Oracle通常可以将某个大"任务"划分为较小的部分,并且并发地执行各个部分。例如,Oralcle需要对一个大表执行全表扫描,那么Oracle完全可以建立4个并行会话(P001-P004)来一起执行完全扫描,每个会话分别读取表中一个不同的部分(既然这样能更快地完成任务,没有理由不这样做)。如果需要存储P001-P004扫描的数据,这个工作可以再由另外4个并行会话(P005-P008)来执行,最后它们可以将结果发送给这个查询的总体协调会话。
如果想记用并行查询,在Oracle中可以添加提示的方式或者修改表的并行度,如
alter table big_table parallel 4
- SQl Server
没有并行查询这个概念。
Oracle在新特性以及在支持数据库开发方面拥有无与伦比的优势,特别是Oracle 11g的面世,相信Oracle在数据库这一领域的优势还将继续扩大。由于篇幅的原因,这里只简单介绍到这里。
•1.9 市场占有率
根据网上的消息,易观国际发布《2006年第3季度中国数据库软件市场数据监测》数据显示,2006年第3季度中国商业数据库市场整体规模达到4.63亿人民币,季度环比增长7.53%。
具体排名的前四甲依次是:Oracle、IBM、Microsoft和Sybase。
Oracle以39%的占有率再排第一,IBM占据了26%的市场份额,微软和Sybase分别占有17.8和13.3,这四者已经占据了96%的市场份额;国产数据库占有少量市场份额,主要应用领域是具有国防和保密性质的部委、航空航天工业以及各地方政府,其中武汉达梦占有0.7%,神州航天占有 0.5%,人大金仓占有1.0%
具体分布信息如下图:
Company |
2005 |
2005 Market Share (%) |
2004 |
2004 Market Share (%) |
2004-2005 Growth (%) |
Oracle |
6,721.1 |
48.6 |
6,234.1 |
48.9 |
7.8 |
IBM |
3,040.7 |
22.0 |
2,860.4 |
22.4 |
6.3 |
Microsoft |
2,073.2 |
15.0 |
1,777.9 |
13.9 |
16.6 |
Teradata |
440.7 |
3.2 |
412.1 |
3.2 |
6.9 |
Sybase |
407.0 |
2.9 |
382.8 |
3.0 |
6.3 |
Other Vendors |
1,134.7 |
8.2 |
1,090.4 |
8.5 |
4.1 |
Total |
13,817.4 |
100.0 |
12,757.8 |
100.0 |
8.3 |
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |