仔细读了一把McGraw.Hill.Microsoft.SQL.Server.2008.Administration.for.Oracle.DBAs的第二章,颇有感触。这种形式的书应该多出,通过对比,即可以复习以前掌握的知识,又能快速学到新技术,还能知晓两者之间的差异。来看看Oracle与SQL Server在Architecture下的异同吧。

High-Level

从High-Level 的层次来看,两者是一致的。都有Instance,Database的概念。

SQL Server VS Oracle 架构下见真章_第1张图片

但是database扮演的角色却大有不同。

在Oracle中,一个实例只能有一个Database,或者在RAC模式下,多个实例对应一个Database。Database中包含多个Schema,比如存放数据字典的SYS,当然还有最常用的用户自己建的Schema。而在SQL Server中一个实例有且必有多个database(怎么感觉像数学公理,O(∩_∩)O~),至少包括system databases 和 user databases。这么看来,倒是可以把Oracle里的Schema理解为SQL Server里的Database。不啰嗦了,一图以蔽之。

SQL Server VS Oracle 架构下见真章_第2张图片

Storage Model 存储模型

SQL Server VS Oracle 架构下见真章_第3张图片

Oracle里通过TableSpace和数据文件把物理存储和逻辑存储隔离开来。上图左边那部分咋这么熟悉,好像在哪见过。翻看《OCP认证考试指南全册Oracle Database 10g》第六章找到了这张图,总算是没白花88元买这本书,O(∩_∩)O~。

Filegroups 跟 Tablespaces 的概念差不多。作为SQL Server存储结构的老大,Filegroups 能力不小,比如可以根据年份设置Filegroup,2009年一个,2010年一个。就如Oracle在建表时可以指定表空间一样,SQL Server同样可以指定Filegroup。

Segment 与 Index/Heap相差老远了,没得可比性。

SQL Server 里8个page组成一个Extent,Extent又可分为两种类型,统一区(uniform)或 混合区(mixed)。Oracle里的Extent就没整得这么复杂了。什么是统一区(uniform)或 混合区(mixed)?网上有这么一段:http://hi.baidu.com/%C3%FA%D3%E3/blog/item/ffe2c10b49773ea32eddd439.html

在一个统一区中,全部8个页都是来自同一个类似表或是索引之类的对象;在一个混合区中,页可以从属于不同的对象。在创建表或是索引时,通常都是从混合区中分配页。在表或索引的数据增长到足够填满8个或更多页的时候,就会自动的切换到统一区中去。

再稍微说明下,当表刚开始被创建时,从混合区拿个8K的页给它用,这个表慢慢长大,从混合区要了第二个,第三个。。。直到第八个。估计这时候,SQL Server被这个表弄烦了,怒吼一声,从第九个页开始,每次给你一个uniform,少来烦我了。混合区可以有很多小对象,统一区就只针对一个Object了。

Block 和Pagesde 也是大相径庭。SQL Server 里的Page固定为8K。Oracle可以通过参数修改Block。SQL Server 里添加数据文件后,都会赋予它一个唯一的文件ID。对于每一个数据文件,空间被分割成一个个8K的页,从0开始标记。

SQL Server VS Oracle 架构下见真章_第4张图片

别看图上第一个文件分出了511页,实际上你不能拥有全部的页。为啥,被SQL Server 这个地主抽出了几页。第0页永远被用来记录文件头,第1页又称PFS,即Page Free Space,用来记录还剩多少空间。后面的几页的也是各有用途,有图为证:

SQL Server VS Oracle 架构下见真章_第5张图片

不由联想到当今的房地产,暗叹一声,这SQL Server的“得页率”咋搞得跟当今的“得房率”一样。看看都是些啥用了我宝贵的页。

SQL Server VS Oracle 架构下见真章_第6张图片

Physical Implementation 物理实现

SQL Server的一个Database通常由三种类型文件组成:primary,secondary,log。

SQL Server VS Oracle 架构下见真章_第7张图片

Transaction Log Files 事务日志文件

SQL Server 的transaction log类似于Oracle的redo log/undo 表空间。每个Database都有自己的 transaction log,因而就具备自我恢复能力。类似于Oracle的SCN(System Change Numbers) 系统变更号,SQL Server 也整出个LSN,日志序列号。每条记录都包含关联的transaction ID,每当异常发生时,SQL Server 就会根据这些记录来回滚。

在Oracle里面,一般至少需要两个 redo 日志文件,实际用到的可能更多。但在SQL Server里面一个Transaction Log 就够用了。因为它内部又分了许多虚拟日志文件,称之为VLF。

SQL Server VS Oracle 架构下见真章_第8张图片

在Oracle里,Redo文件可以有三种状态,当前在用是CURRENT,要求待命随时准备恢复的ACTIVE,不再用来做恢复,没有利用价值就成了INACTIVE。SQL Server 也有类似概念。残酷的Min LSN点,过了这个点你就是社会栋梁,还可以用来做回滚或恢复。但是不要以为你费尽九牛二虎之力挤过了那个点就可以高枕无忧了。长江后浪推前浪,前浪死在沙滩(Min LSN)上。Min LSN是会随着 transaction 事件不断前移的。

SQL Server VS Oracle 架构下见真章_第9张图片

 

 

 

再来说说恢复模式吧。Oracle有NOARCHIVELOG,SQL Server有类似的SIMPLE。在SIMPLE模式下,日志越来越多,空间不够用了怎么办?不是还有之前没挤过Min LSN独木桥的兄弟嘛?过河拆桥还不会,Truncated掉。

SQL Server 有FULL 和BULK_LOGGED模式来对应Oracle的ARCHIVELOG。这种方式稍微人道一点,先给你备份一下,再咔嚓掉。O(∩_∩)O~,先摸摸你的头,再温柔一刀。

Database Snapshots 数据库快照

SQL Server 也有快照查询。下图展示了快照查询的原理。场景一,如果源数据没有修改,直接返回源数据查询结果。场景二,源数据里某条记录被修改了,在Update源数据的同时,会复制原来的记录,插到数据库快照。场景三,再来查询(快照查询语法),就会返回那时那刻的快照记录。

SQL Server VS Oracle 架构下见真章_第10张图片

Inside the Instance 深度解剖

SQL Server主要由四大块组成:the protocol layer,the relational engine, the storage engine, and SQLOS.

SQL Server VS Oracle 架构下见真章_第11张图片

 

Protocol Layer 协议层,顾名思义,主要就是通过各种协议来接收客户端请求,最常用的应该是TCP/IP了。

Relational Engine 又称query processor,从协议层接收到T-SQL事件后,开始解析,优化,最后执行。跟Oracle也挺相似的,一个SQL 语句过来后,过五关斩六将(parser, optimizer, row source,generator)才能最后到达SQL execution engine。

Storage Engine,这一层开始跟数据文件打交道,缓存和事务控制也在这一层引入。Transaction manager就是用来保证ACID(数据库事务正确执行的四个基本要素),并且跟Oracle一样用的都是Write ahead logging方式。

SQLOS,引用百科:将操作系统从SQL Server引擎中抽象出来,并提供服务以最大限度利用这些架构,同时保留现有架构。SQLOS对服务器的其他部分提供用户级的操作系统服务,这就是“SQLOS”名称的由来。SQL Server引擎中的组件利用SQLOS提供的服务,来调度单个或者多个任务、分配内存等。

Background Processes 后台进程

Oracle里面有很多后台进程,比如SMON,PMON,RECO,CKPT,DBWn等等。到了SQL Server里,也有一堆后台线程,例如Lazywriter,Checkpoint,Log writer,Deadlock/Lock monitor,Scheduler monitor,Resource monitor等等。

Client/Server Communication 客户端/服务器通信

先来温习下Oracle的通信方式。

客户端需要安装Oracle Net client。Oracle Net foundation layer先把请求打包成Oracle专有格式,Oracle Protocol Support layer把请求再度封装以TCP/IP或Named Pipes的方式发到服务器端。当服务器端返回请求结果后,操作则刚好相反,两次解析取得结果。

服务器端有个Listener,干什么用的(⊙o⊙)?我戏称为一次性用品,用来初始化连接,当连接建立起来后就没它什么事了。

SQL Server VS Oracle 架构下见真章_第12张图片

再来看SQL Server。类似于Oracle client,SQL Server有SNAC (SQL Server Native Client),支持以OLE DB,ODBC,或者ADO.NET的方式连接到服务器。请求同样也会被再封装一下,自然是Microsoft的格式,叫什么TDS (Tabular Data Stream)。同样与Oracle相似,有个SQL Server Network Interface (SNI) protocol 层来打包和解包TDS数据包。

SQL Server就没有 Listener 的概念了,而是通过TDS Endpoint来侦听各种协议过来的客户端请求。

SQL Server VS Oracle 架构下见真章_第13张图片