ITPub博客

存储引擎

原创 Linux操作系统 作者:hwtong 时间:2011-12-07 21:53:00 0 删除 编辑
[i=s] 本帖最后由 hwtong 于 2011-12-5 21:40 编辑

SQL Server存储引擎包括设涉及访问和管理数据的所有组件.在SQLServer 2008中,存储引擎主要包括三个部分:访问方法,锁定和实物服务及实用工具命令.

1.访问方法
SQLServer查找数据时,需要调用访问方法代码.访问方法代码建立并请求数据页和索引页扫描,并准备OLEDB行集来返回关系引擎.类似的,在插入数据时,访问方法代码可以从客户端检索OLEDB行集.访问方法代码含有对应的组件来执行打开表,检索合格数据和更新数据操作.访问方法代码实际上并不检索页面,它向缓冲管理器发送请求,最后缓冲管理器在其缓存中提供页面,或者将页面从磁盘读到缓存中.扫描启动时,预测先行机制将对页面上的行或索引条目进行鉴定.满足特定标准的行检索名为合格检索.不仅SELECT语句中可以使用访问方法代码,有些UPDATE和DELETE语句(含有WHERE条件),以及需要修改索引条目的任何数据修改操作也可以使用访问方法代码.下面列出了一些访问方法类型.
行和索引操作.你可以将行和索引操作看成是访问方法代码组件,因为他们执行真正的访问方法.每个组件分别负责操作和维护格子在磁盘上的数据结构(分别指数据行或B索引).他们理解并操作数据和索引页上的信息.
行操作代码用于检索,修改并执行单个行上的操作.它在一行中进行操作,如"检索第2列"或"将该值写入第3列".在访问方法代码,锁及事务管理组件(稍后讨论)的协同工作下,需要的行被找到并被锁定(作为事务的一个执行部分).在内存中格式化或修改行以后,行操作代码将插入或删除一行.如果数据是大型对象数据类型(text,image或ntext),或者行太大无法在单个页面上显示而需要存储为溢出数据时,行操作代码需要处理特殊的操作.
索引操作代码维护并执行搜索B树,B树用于构造SQLServer索引.索引是一种树结构,含有根页面,中级页面和低级页面(如果树非常小,也许没有中级页面).B树把含有相似索引键的记录进行分组,因此通过搜索关键值可以快速访问数据.B树的核心功能是能够平衡索引树.索引树的分支根据需要相互连在一起或者拆开,因为对于任何给定记录的搜索,将始终遍历相同数目的级别,因而需要相同数目的页面访问.

页面分配操作.分配操作代码管理每个数据库页面的集合,并跟踪一些信息,如数据库中哪些页面已经使用了,为什么使用这些页面,以及每个页面上还有多少可用空间.每个数据库都是8KB的磁盘页面集合,这些磁盘页面分布在一个或多个物理文件中.
SQLServer使用13种磁盘页面.磁盘页面包括:数据页面,两种LOB页面.行溢出页面,索引页面,页面可用空间(PFS)页面,全局分配映射和共享全局分配映射(GAM和SGAM)页面,索引分配映射(IAM)页面,批处理更改映射(BCM)页面,以及差异更改映射(DCM)页面.
所有用户数据都存储在数据或LOB页面上,所有索引行都存储在索引页面上.PFS页面用于跟踪数据库中哪些页面可用于存储新数据信息.分配页面(GAM,SGAM和IAM)用于跟踪其他页面,他们不包含数据库行,并且仅在内部使用.BCM和DCM页面用于使备份和还原变得更加有效.
版本操作.版本存储是SQLServer2005产品中添加的另一种数据访问类型.行版本允许SQLServer维护旧版本的更改行.SQLServer中的行版本技术支持快照隔离和SQLServer2008的其他功能,其中包含联机索引结构和触发器.版本操作代码负责维护行版本.
2.事务服务
SQLServer的核心功能是能够确保事务是原子性的-也就是说,全部或者无.另外事务必须是持久的,这意味着如果事务已经提交了,那么无论在何种情况下,都可以通过SQLServer进行恢复,哪怕整个系统在确认提交后1毫秒出现故障.事实上,事务必须满足4个属性:原子性,一致性,隔离性和持久性,这称为ACID属性.
在SQLServer中,如果任务正在处理中,并且在提交事务之前出现了系统故障,那么所有工作必须回滚到事务开始前得状态.预写日志记录(Write-ahead logging)用于使处理中的任务回滚,或者使未应用到数据页中的提交任务执行前滚成为可能.在事务确认提交之前,预写日志记录能够确保在磁盘的事务日志中捕获每个事务记录的变化,并且在把真正发生变化的数据页写入磁盘之前,始终先在磁盘中写入日志记录.写入事务日志始终是同步的,即SQLServer必须等待他们完成.但写入数据页可以是异步的,因为所有效果都可以根据需要在日志中进行重构.事务管理组件用于协调日志,恢复和缓冲管理.
事务管理组件描述形成某个操作而必须组合在一起的语句边界.它用于处理相同SQLServer实例中的跨数据库事务,并能处理嵌套事务序列(不过,嵌套事务仅在第一级事务环境中执行:提交嵌套事务时,并能出现特别的操作.低级嵌套事务中指定的回滚操作将取消全部事务).对其他SQLServer实例(或对任何其他资源管理器)的分布式事务而言,事务管理组件使用操作系统远程过程调用用来处理MSDTC服务.事务管理组件标记了保存点,在事务中通过保存点指示可以在此处部分回滚或取消事务.
根据实际的隔离级别,当锁可以释放时,事务管理组件还可以配合相关锁代码进行工作.它还可以配合版本代码确定何时不再需要旧版本,并且可以把它从版本存储中删除.事务运行的隔离级别确定了应用程序受其他程序影响的敏感度,因而也确定了事务应对这些变化所必须保持锁定或维护版本数据的时间.
SQLServer2008支持两个并发模型来保证事务的ACID属性:乐观并发和悲观并发.乐观并发通过锁定数据来确保正确性和并发性,使数据不发生改变;SQLServer2005之前的SQLServer版本都以独占方式使用这种并发模型,SQLServer2005和2008默认情况下也以独占方式使用这种模型.SQLServer2005引入了乐观并发,它在名为version store的tempdb区域通过保留旧的行版本和已提交的值来提供一致性数据.在悲观并发中,读程序不会阻塞写程序,写程序也不会阻塞读程序,但写程序仍然会阻塞写程序.实际操作中必须考虑这些非阻塞读取和写入行为的开销.为了支持乐观并发,SQLServer需要花费更多的时间来管理版本存储存储.另外,管理还必须密切关注tempdb数据库,并计划为它提供特殊维护.
SQLServer2008提供了5种隔离级别语法.其中仅3种支持悲观并发:未提交读,可重复读和序列化.快照隔离级别支持乐观并发.默认的隔离级别-已提交读-能够同时支持乐观并发和悲观并发,具体情况取决于数据库设置.
事务的行为取决于采用的隔离级别和并发模型.全面理解隔离级别还需要理解锁定的含义,因为他们是密切相关的.

锁定操作.锁定是多用户数据库系统中一个非常重要的函数,即便在快照隔离级别中使用乐观并发进行操作,该函数也非常重要.SQLServer允许你同时管理多个用户,并确保事务能查看选定隔离级别的属性.虽然子啊快照隔离中度程序不会阻塞写程序,写程序也不会阻塞读程序,但是写程序仍然需要锁定,写程序可以阻塞其他写程序.如果两个写程序试图同时更改相同的数据,就必须解决冲突问题.锁定代码将获取和释放各种锁,如读取共享锁,写入独占锁,在更高粒度发出潜在"计划"执行某些操作的意向锁,以及供空间分配使用的扩展锁.它管理不同类型锁的兼容性,解决死锁问题,以及根据需要增强锁的功能.锁定代码用于控制表,页面,行和系统数据锁定.
3.其他操作
另外,存储引擎中还包含用于控制实用工具的组件,如大容量加载,DBCC命令,全文索引填充与管理,以及备份和还原操作.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16754036/viewspace-712901/,如需转载,请注明出处,否则将追究法律责任。

上一篇: SQL-OS介绍
下一篇: SQLServer关系引擎
请登录后发表评论 登录
全部评论

注册时间:2009-07-06

  • 博文量
    116
  • 访问量
    279652