您的位置:首页 > 数据库 > Oracle

Oracle与SQL Server数据库的异同

2016-04-25 16:25 495 查看
实例和数据库的关系

实例是运行在内存中的一系列进程,用于相应客户端请求,在内存中缓存数据以及与数据库交互等等。而数据库是实际存储数据的组织。

Oracle中一个实例只能对应一个数据库,或多个实例对应一个数据库,这种架构称为RAC--Real Application Cluster。对于每个实例,有一个SID(System ID)来唯一标识,在连接到数据库服务器时需要提供(或者提供service name也可以)。关于SID和Service name的区别可自行搜索。

SQL Server中一个实例可以对应多个数据库,同时一台机器可以按照多个实例。由于同一台机器上的多个实例需要互相区分,因此如果仅安装一个实例则使用默认实例,如果安装多个实例,则需要使用命名实例。

数据存储结构
Oracle中,关于存储的逻辑概念有:

block--由多个IO blocks组成,一般为4或8KB

extent--一段连续的blocks,用于存储特定的信息

segment--由一系列的extents构成,用于存储特定的数据库对象,例如表。每个数据库对象都存储在单独的segment中。需要注意的是segment可以跨多个data file。

tablespace -- 一个数据库有两个tablespace: System tablespace & Data tablespace。每个tablespace可有多个data file,但data file不可跨tablespace,也不可跨磁盘。

关于存储的物理结构有:

IOS block--指磁盘层面的最小读写单元

data file--数据文件,在ios层面可实际观察到的文件

具体请参考:
http://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#CNCPT301
SQL Server中存储的逻辑概念有:

data page--SQL Server存储数据的最小单元,大小为8KB。

extent--8个data pages构成一个extent,因此一个extent的大小为64KB。extent又分为两种,uniform and mixed。通常一个数据库对象由多个uniform extent构成,但当对象足够小的时候,也可以由多个对象共用多个mixed extents。

请参考:
https://technet.microsoft.com/en-us/library/ms190969(v=sql.105).aspx
物理结构上由文件和文件组构成,请参考:
https://technet.microsoft.com/en-us/library/ms179316(v=sql.105).aspx
Schema

Oracle和SQL Server中schema的概念是类似的。



Oracle中有多种多样的表:

Ordinary table--就是各个关系型数据库中都可定义的表。

Object table -- Oracle中可以定义对象类型,每个对象类型可以包含成员变量,成员方法。而object table是一类特殊的表,其中每行数据都是一个对象。每行可以用OID来唯一标识。

Heap-organized table -- 指表中的数据没有任何顺序的表。

Index-organized table -- An index-organized table orders rows according to the primary key values. 但SQL Server中用clustered-index来对表数据排序。注意定义primary key并不会让表成为index-organized table,还需要指定ORGANIZATION INDEX关键字。

External table -- 指在Oracle中仅存储了元数据,而数据本身则不再数据库之内。例如真正的数据可能是一个txt文件。

Temporary table--Oracle中的临时表是永久性的,即用户创建临时表后,该表就会存在于用户schema下。但表中的数据会随着用户断开session被删除或随着事务的结束被删除。

Table Clusters--A table cluster is a group of tables that share common columns and store related data in the same blocks.

Hash Clusters--

可参看下例链接:
http://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT1859
SQL Server:

Ordinary table--同上

heap table -- 指没有建立任何索引的表

non-heap table -- 指建立了索引的表。SQL Server中通过创建clustered index来对表的物理数据排序,中文是聚集索引。注意和Oracle的table clusters是完全不同的东西。

Temporary table -- 在TSQL中可以定义临时表,用于存储计算中间结果,如DECLARE #t_table TABLE (XXX)。临时表的数据在硬盘上,属于temp数据库。当用户session断开时,临时表被drop掉。另外SQL Server还提供表变量,用于在内存中存储中间结果,如DECLARE @t_table TABLE (XXX)。

external table -- SQL Server中的外部表和Oracle的外部表是类似的,但SQL Server的外部表仅用于查询Hadoop cluster或Amazon cloud中的数据。

视图

Oracle中的视图有:

View -- 可以被看做一个保存了的query,而不是一个实际的表。但向view执行DML会引起底层的表数据发生变化。

Object view -- 普通的view是基于普通表,而object view则是基于object table。

Materialized Views -- 物化视图,即视图不再是一个query,而是一个真实的表。由定义可知当基表的数据变化时,必然需要将数据同步到物化视图,且必然是异步的。oracle的物化视图可以选择是增量更新还是完全更新方式。另外只能在物化视图上创建索引,普通视图不可以。

SQL Server中的视图有普通视图和物化视图。当在一个普通视图上创建index时,该视图就成为了物化视图。

索引

Oracle中有两种结构的索引:B-tree索引和bitmap索引。B-tree索引为默认使用的索引,bitmap索引在某些特殊情况下可提高查询效率。

SQL Server仅支持B-tree索引。

ROWID和RID

Oracle中每个表都会有一个伪列(pseudo column),称为ROWID。ROWID由18位字符组成,可唯一定位的每一行数据。其形式为:

object_number(6位):file_number(3位):block_number(6位):row_number(3位)

在Oracle中,ROWID Seek是一中较高效的定位数据的方式。

SQL Server中则不提供ROWID。与之最接近的是RID,其形式为:

File:Page:Slot

SQL Server仅在对heap表查询时才会使用RID定位数据。在建立了聚集索引的表中,由于索引的页级节点就是表本身,因此不需要使用RID来定位数据。

Join算法

当涉及多表联合查询时,Oracle提供如下join算法:

nested loops

sort-merge

cluster -- 专门用于在一个cluster中的cluster table。SQL Server因为没有table cluster,因此也没有cluster join。

hash join (not available with rule-based optimization)

SQL Server则提供nested loops,sort-merge和hash join 。

序列

Oracle中的sequence是用户定义的,可多表共用的数据结构。它用于在表中产生自增字段,通常用来产生primary key。

SQL Server则在各个表中设置自增字段,因此并非是独立的数据结构,也不能多表共用。其功能与Oracle类似。



分区表,分区视图和分区索引


Oracle和SQL Server中都可将表分区,其功能相同。

执行计划

执行计划指The EXPLAIN PLAN statement displays execution plans chosen by the Oracle optimizer。

Oracle和SQL Server中执行计划的功能和原理是相同的。

在Oracle中使用SET AUTOTRACE ON来执行SQL并显示执行计划,若不想运行SQL,只查看执行计划则使用SET AUTOTRACE TRACEONLY。

SQL Server中的execution plan仅查看执行计划,并不运行SQL,如要查看实际的运行情况和统计数据,则是查看actual plan。

Tlog和Redo log

在Oracle中,使用redo log来处理事务回滚等操作,在SQL Server中则是Tlog。二者功能相近。

Oracle中当redo log将log group填满后,默认会自动归档,但也可以关闭该功能。称为NOARCHIVELOG and ARCHIVELOG Mode。
http://docs.oracle.com/cd/B28359_01/server.111/b28310/archredo002.htm
而在SQL Server中则称为recovery mode。Recovery mode有三种:full mode,simple mode和bulk logged mode。full mode对应ARCHIVELOG mode,simple mode对应NOARCHIVELOG mode。生产数据库都应工作在full mode或archivelog下。

集群

SQL Server提供两种形式的cluster:Failover Cluster和Avalibility Groups

最大的区别是,Failover Cluster有两个实例共享一个物理存储(通常是SAN),且同一时刻只有一个实例能访问物理存储。当当前实例由于各种原因,例如内存占用超过阈值了,就会自动做failover,到另外一个实例上。但总得来说物理存储只有一份,虽然SAN的安全性很高。而Avalibility Groups则使用了更复杂的架构,使得不再共享一个存储,而真正实现了多副本的集群。

Oracle提供RAC--Real Application Cluster。由于它和Failover Cluster一样共享一个物理存储,因此更接近于Failover Cluster。但区别是RAC实现了多实例可同时访问一个物理存储,因此实现了动态负载均衡,也增大了缓存的数据,从而提高了查询效率。缺点是对于写操作,磁盘IO可能会成为瓶颈。
https://msdn.microsoft.com/en-us/library/ff929171.aspx#SQLServerFC
多维数据库

Oracle提供两个多维数据库产品:Essbase 和 Oracle OLAP

SQL Server提供SSAS
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: