SQL Server 2008存储体系结构
有一次,我花了大半天时间为约3 0 位新的数据库管理员讲解关于存储体系结构的问
题。在课间休息时,一位学员找到我并尖锐地问道:“我为什么要学习这些内容呢?我是说,
谁会关心SQL Server如何存储数据?只要它能存储数据就够了。”这些问题很合理,就像 虽然我并不知道我汽车的燃油喷射系统是如何工作的,却一点也不会影响我开车一样。然
而关键的区别在于,当我的汽车出了毛病,需要修理服务时,我会把它交给修理工。可是
如果数据库出现问题,去找谁解决呢? 了 解 SQL Server的存储体系结构将帮助您对在何处 存储数据、如何索引数据,以及如何检修有问题的数据库作出明智的决定。
多年来,SQL Server数裾库管理员已习惯于不受限制地访问系统对象。这种访问权赋 予了数据库管理员难以置信的能力—— 这种能力有利也有弊。例如,数据库管理员可以开
启对系统表的即席更新,然后修改任意值,包括密码散列。对于纠正一些系统错误来说,
这种能力当然是有用的;但与此同时也可能产生更多的危害。
在过去,虽 然 Microsoft强烈建议不要直接访问系统对象,但有时候却针对数据库问题
提供了需要直接更新系统表的解决方案。随 着 SQL Server 2005和 SQL Server 2008的发布,
这个明显的矛盾不复存在。因 为 除 非 Microsoft(或某个神秘的第三方组织)发布某种隐含的 秘密握手协议来解除对系统对象的更改锁定,否则数据库管理员根本就无法对系统对象进
行更新。甚至对系统表的只渎访问也受到限制,只能通过专用管理员连接(DAC)来完成,
而且对此还有一个免责声明“通过 使 用 DAC访问系统基表的功能是专门为Microsoft A 员设计的,它不是支持的客户方案。”
Microsoft做了大量工作。他们研究了数据库管理员对系统表执行即席更新的主要原 因,并提供了在受控方式下执行这些动作的机制,从而避免损害系统目录的完整性。
在本章中,您将学习SQL Server 2008如何存储和组织数据。这方面的知识有助于优化
和 调 整 SQL Server,以及检修性能问题。
4.1 Resource 数据库
锁定系统对象的一个主要原 因 在 P现在它们有一个共同的来源,即 Resource数据库。 该数据库是所有系统对象的物理存储库,在 SQL Seiner的正常操作期间不可访问。虽然系 统对象在物理上都存储于Resource数据库中,但它们在逻辑上表示为每个数据库中的sys
架构。Microsoft强烈建议不要访问Resource数据库,但如果在单用户模式下启动SQL Server,则可以访问这个数据库。但是这种访问也是只读的,就如同对sys架构中的任何对 象的访问一样。即使已经启用了对系统目录的即席更新,任何旨在修改系统对象的尝试也
都将导致错误。
将所有系统对象持久化到Resource数据库中可以快速部署服务包及升级到SQL Server 2008。在安装服务包时,这个过程只是用新版本的Resource数据库替换原有版本,并且对 运行的系统对象执行所需的任何改动。这大大减少了升级SQL Server所需的时间。 虽然在正常的SQL Server操作时不可以访问Resource数据库,但是可以使用系统函数 和全局变量检索数据库的有关信息。下列代码返回了 Resource数据库的内部版本号。
SELECT SERVERPROPERTY(*ResourceVersion')
为了返回Resource数据库的最后更新日期和时间,可以执行下面的代码:
SELECT SERVERPROPERTY(1ResourceLastUpdateDateTime')
sys架构
如前所述,存储在Resource数据库中的系统对象在逻辑上会出现在每个数据库的sys 架构中。sys架构包含可以被数据库管理员用来检索有关数据库中对象的信息的视图。一般来 说,数据库管理员需要访问的人多数(但不是全部)信息都可通过使用系统函数和存储过程
获取,它们会返回系统对象的元数据。然而,有时候直接从系统对象中检索元数据更有帮
助。sys架构中的视图就用于此目的。 如果您曾经使用过SQL Server 2000的系统表,就会发现几乎所有旧系统表的名称都得 以保留,只是现在用来命名视图。不过,这些视图只是为了向后兼容而提供的。它们没有
提供任何SQL Server 2008特有的元数据。今后的任何操作均应基于新的SQL Server 2008
系统视图。用于取代旧的系统表功能的视图称为向后兼容视图,Microsoft官方称这些视图 将在未来版本中删除。
需要注意,一般在创建任何会直接使用来自于系统对象的系统元数据的脚本或应用程
序时,都应该牢记它们可能无法在新版本的SQL Server中使用。这并不是什么新鲜的事情。 多年以来,Microsoft—直反对使直接访问系统对象的进程正式化,并警告说未来的升级和 服务包可能更改系统对象。这意味着,通常应使用动态管理视图和函数(下面将介绍)以及
系统存储过程。
动态管理视图和函数
除了可以用来査看系统元数据的传统的系统对象之外,sys架构中的新的动态视图和 函数展示了有关SQL Server进程和数据库活动的一些非常有用的信息。动态视图和函数被 分为以下几个功能类别:
• 与公共语言运行时有关的动态管理视图
• 与 I/O有关的动态管理视图和函数
• 与数据库镜像有关的动态管理视图
与查询通知有关的动态管理视图
• 与数据库有关的动态管理视图
• 与复制有关的动态管理视图
• 与执行有关的动态管理视图和函数
• 与 Service Broker有关的动态管理视图
• 与全文搜索有关的动态管理视图
• 与 SQL Server操作系统有关的动态管理视图
• 与索引有关的动态管理视图和函数
• 与事务有关的动态管理视图和函数
• 与变更数据捕获有关的动态管理视图
• 资源调控器动态管理视图
• SQL Server扩展事件动态管理视图
• 与安全相关的动态管理视图
• 与对象相关的动态管理视图和函数
许多动态视图和函数取代了 SQL Server 2000的 系 统 存 储 过 程 和 DB€C(Database
Consistency Checker,数据库一致性检查)命令。虽然大部分旧有的存储过程和DBCC命令 仍然存在,但它们仅为向后兼容而提供,并不展示新的SQL Server 2008对象和进程。新的 视图和函数提供更详细的信息并返冋相关的结果集,可以在定制的监控应用程序中轻松使
用这些结果集。
在后面的章节中,我们将在讲述数据库维护和监控任务时使用并说明大量(但并非全部)
视图和函数。要了解有关各个系统视图和函数的完整介绍,可参阅SQL Server联机丛书中 的 “动态管理视图和函数”主题。