设为首页 收藏本站
查看: 859|回复: 0

[经验分享] SQL Server VS Oracle 架构下见真章

[复制链接]

尚未签到

发表于 2016-8-3 23:11:07 | 显示全部楼层 |阅读模式
仔细读了一把McGraw.Hill.Microsoft.SQL.Server.2008.Administration.for.Oracle.DBAs的第二章,颇有感触。这种形式的书应该多出,通过对比,即可以复习以前掌握的知识,又能快速学到新技术,还能知晓两者之间的差异。来看看Oracle与SQL Server在Architecture下的异同吧。
High-Level
从High-Level 的层次来看,两者是一致的。都有Instance,Database的概念。
DSC0000.png
但是database扮演的角色却大有不同。
在Oracle中,一个实例只能有一个Database,或者在RAC模式下,多个实例对应一个Database。Database中包含多个Schema,比如存放数据字典的SYS,当然还有最常用的用户自己建的Schema。而在SQL Server中一个实例有且必有多个database(怎么感觉像数学公理,O(∩_∩)O~),至少包括system databases 和 user databases。这么看来,倒是可以把Oracle里的Schema理解为SQL Server里的Database。不啰嗦了,一图以蔽之。
DSC0001.png
Storage Model 存储模型
DSC0002.png
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开始标记。
DSC0003.png
别看图上第一个文件分出了511页,实际上你不能拥有全部的页。为啥,被SQL Server 这个地主抽出了几页。第0页永远被用来记录文件头,第1页又称PFS,即Page Free Space,用来记录还剩多少空间。后面的几页的也是各有用途,有图为证:
DSC0004.png
不由联想到当今的房地产,暗叹一声,这SQL Server的“得页率”咋搞得跟当今的“得房率”一样。看看都是些啥用了我宝贵的页。
DSC0005.png
Physical Implementation 物理实现
SQL Server的一个Database通常由三种类型文件组成:primary,secondary,log。
DSC0006.png
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。
DSC0007.png
在Oracle里,Redo文件可以有三种状态,当前在用是CURRENT,要求待命随时准备恢复的ACTIVE,不再用来做恢复,没有利用价值就成了INACTIVE。SQL Server 也有类似概念。残酷的Min LSN点,过了这个点你就是社会栋梁,还可以用来做回滚或恢复。但是不要以为你费尽九牛二虎之力挤过了那个点就可以高枕无忧了。长江后浪推前浪,前浪死在沙滩(Min LSN)上。Min LSN是会随着 transaction 事件不断前移的。
DSC0008.png
 
 
 
再来说说恢复模式吧。Oracle有NOARCHIVELOG,SQL Server有类似的SIMPLE。在SIMPLE模式下,日志越来越多,空间不够用了怎么办?不是还有之前没挤过Min LSN独木桥的兄弟嘛?过河拆桥还不会,Truncated掉。
SQL Server 有FULL 和BULK_LOGGED模式来对应Oracle的ARCHIVELOG。这种方式稍微人道一点,先给你备份一下,再咔嚓掉。O(∩_∩)O~,先摸摸你的头,再温柔一刀。
Database Snapshots 数据库快照
SQL Server 也有快照查询。下图展示了快照查询的原理。场景一,如果源数据没有修改,直接返回源数据查询结果。场景二,源数据里某条记录被修改了,在Update源数据的同时,会复制原来的记录,插到数据库快照。场景三,再来查询(快照查询语法),就会返回那时那刻的快照记录。
DSC0009.png
Inside the Instance 深度解剖
SQL Server主要由四大块组成:the protocol layer,the relational engine, the storage engine, and SQLOS.
DSC00010.png
 
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⊙)?我戏称为一次性用品,用来初始化连接,当连接建立起来后就没它什么事了。
DSC00011.png
再来看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来侦听各种协议过来的客户端请求。
DSC00012.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252468-1-1.html 上篇帖子: Oracle 11g R2通过透明网关连接DB2 下篇帖子: 配合rails的oracle连接和字符集配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表