Professional Documents
Culture Documents
0
性能调整指南
本文档中包含的信息代表了微软公司在出版时对所讨论问题的观点。由于正在
进行的开发工作的本身特性,且因为微软公司必须对正在变化的市场情况作出
反应,它不应当认为是微软公司的承诺,并且微软公司不对出版后的任何信息
的准确性作任何担保。
本文档仅用于资料用途。微软公司在本文档中,未作任何明示或暗示的担保。
© 1998 微软公司。保留所有权利。
Microsoft, ActiveX, BackOffice, the BackOffice logo, Fox Pro, PivotTable, Visual
Basic 和 Windows NT 是微软公司在美国和/或其他国家的注册商标或商标。
这里提到的其他产品和公司名称可能是其各自所有者的商标。
微软公司产品编号: 098-80705
目录
观 众......................................................................................................................................3
介 绍......................................................................................................................................3
Microsoft SQL Server 6.x 版到 7.0 版的性能调整比较
...................................................................................................................................4
SQL Server 性能调 整原 则...............................................................................................5
评 价配置 期间 的 max async IO 选项..............................................................................6
磁 盘 I/O 性能....................................................................................................................10
磁盘传输率及 SQL Server 中的磁盘传输率.............................................................10
顺序与非顺序磁盘 I/O 操作.......................................................................................11
磁盘 I/O 传输率和 PCI 总线带宽..............................................................................12
RAID............................................................................................................................12
硬件 RAID 控制器自带高速缓存的影响...........................................................13
RAID 级别............................................................................................................14
普通 RAID 等级 .................................................................................................14
联机 RAID 扩充...................................................................................................15
性能监控器和 RAID............................................................................................15
Windows NT 软件方式 RAID..............................................................................16
并行磁盘 I/O ..............................................................................................................16
SQL Server 索引...............................................................................................................18
簇索引..........................................................................................................................19
非簇索引......................................................................................................................20
覆盖索引......................................................................................................................20
自动的覆盖索引或覆盖查询......................................................................................21
索引选择......................................................................................................................21
簇索引选择..................................................................................................................22
簇索引选择方案....................................................................................23
FILLFACTOR 和 PAD_INDEX.................................................................................24
2
分析 SQL Server 配置文件信息..........................................................................27
SQL Server 查询分析器..............................................................................................28
I/O 次数统计.........................................................................................................28
ShowPlan...............................................................................................................28
Showplan 输出示例.......................................................................................29
性能监控器(Performance Monitor):...................................................................34
关键的性能监控器功能......................................................................................36
(物理或逻辑的)磁盘队列> 2..................................................................36
系统: 处理器队列长度> 2 (每个 CPU)......................................................36
硬分页 Memory: Pages/Sec > 0 或者 Memory: Page Reads/Sec > 5......37
软分页 Memory: Pages Faults/Sec > 0 .......................................................38
监控处理程序.......................................................................................................38
磁盘 I/O 次数计数器.........................................................................................39
性能监控器图形输出...........................................................................................40
查 找更多 的信 息..............................................................................................................44
这份性能调整指南提供了一系列的信息,来帮助数据库管理员进行配置,以使
Microsoft® SQL Server™达到最优性能,并帮助他们搞清楚在 SQL Server 环境下造
观众 成性能损失的原因。本文档同时还提供了如何使用 SQL Server 索引,如何使用
SQL Server 工具,这些工具帮助分析 SQL Server 查询的 I/O 执行效率。
3
Microsoft SQL Server 6.x 版到 7.0 版的性 能调 整比 较
4
对数据库服务器操作来说,分割页 Microsoft SQL Server 的早期版本中, 因为在分割页时需要重新计算索引页的
的开销颇大。 行数,因此需要大大调整 B 树索引页(当插入行填满了数据页或索引页时,
会发生分割页的情况)。SQL Server 7.0 对存储结构的改变使这个问题最小化。
非簇索引页(Nonclustered index pages)为没有簇索引的表(这样的表称之为
堆)采用固定 RID(行 IDRow ID),有簇索引的表采用簇关键字。这样使插
入操作和分割页操作时对 B 树的维护工作大大减少了。总体影响是索引的维
护速度加快,这意味着在不影响数据修改性能的情况下,可以建立更多的非
簇索引。若想获取更多资料,请查阅 SQL Server 7.0 联机帮助的相关主题及/或
关键字:改善的结构、表结构及索引结构、分割页
SQL 跟踪(SQL Trace) Microsoft SQL Server 7.0 提供了 SQL Server 剖视器(Profiler),它代替了 SQL
Server 6.5 中的 SQL 跟踪( Trace) 工具。SQL Server 剖视器 提供了相似的、
但明显改善了的功能。
ISQL/W 在 SQL Server 7.0 中, SQL Server 查询分析器(Query Analyzer)代替了 SQL
Server 早期版本的 ISQL/W 。
设备及分段 Microsoft SQL Server 7.0 引入文件和文件组 (files and filegroups),以此来代
替早期版本的设备模型和段模型。 这些文件和文件组为数据在磁盘和磁盘阵
列的合理分布提供了一种更便利的方法。若想获取更多资料,请查阅 SQL
Server 7.0 联机帮助的相关主题:为文件组加索引,为文件组、文件及文件组
设置表,使用文件及文件组管理数据库变化。
Microsoft SQL Server 7.0 引进和改善了一
些调整 SQL Server 性能以达到最优性能
SQL Server 性能调整原则 的方法和工具。当你调整你的 SQL
Server 时,请遵循以下原则:
• 让 SQL Server 完成大部分的调整工作。
Microsoft SQL Server 可以创建一个自动配置及自动调整的数据库服务器。充分
利用 SQL Server 提供的自动调整设置功能。这些设置帮助 SQL Server 保持以最
佳性能运行,甚至在用户装入内容不断变化或者查询内容不断变化的情况下也
能保持。
• RAM 是有限的资源。
• 挑选好的索引。
• 评价磁盘 I/O 子系统性能。
• 调整应用程序和查询程序
当数据库服务器处理由特定应用程序指定的、来自成百上千个连接点的服务请
求时,调整应用程序和查询程序变得非常重要。因为在典型情况下,是应用程
5
序确定运行于数据库服务器上的 SQL 查询,所以应用程序开发者必须懂得 SQL
服务器的基本框架,以及如何充分利用 SQL Server 索引来使 I/O 最小化。
SQL Server 剖视器(Profiler)可以用来监测 SQL Server 的工作量,并为其做日
志文件,然后可以将其递交给索引调整向导(Index Tuning Wizard) ,为实现
更好的性能而对索引重新进行调整。经常使用 SQL Server 剖视器和索引调整向
导可以帮助你优化索引,使 SQL Server 在查询工作改变的情况下仍能以较好的
性能工作。
• 利用 SQL Server 性能监视器(Performance Monitor)。
SQL Server 7.0 提供了一套修改过的性能监视器对象和计数器,它们可以用来为
监视和分析 SQL Server 操作提供有用的信息。这篇文档描述了性能监控器中一
些重要的计数器。
SQL Server 7.0 查询分析器引入了图形化显示方案,帮助分析在 TransactSQL 查
询时出现的问题。SQL Server 查询分析器还包含 STATISTICS IO ,这是调整查
询功能的另一个重要的工具选项。
在 Microsoft SQL Server
7.0 的初始化配置期间,
评价配 置期间的 max async IO 选项 如果需要的话,应对
max async IO 选项进行
评价和调整。
max async IO 选项的缺省值是 32,这对低级磁盘子系统来说已经足够。但如果数
据库服务器使用提供高速磁盘 I/O 传输的高级磁盘子系统——RAID,设置为 32 可
能就不够了,因为 RAID 子系统可以完成的磁盘同步传输请求数目远不止 32 个。
如果 SQL Server 写操作也要求更高的磁盘传输能力,那么 max async IO 选项的值
应该设置的更高一些。
max async IO 选项应当满足合适的值:在要求下一个检查点(基于期望恢复的性质)
之前,本检查点应该完成监测任务。而不是将这个选项值设置得过大,以至于使系
统被监测事件严重堵塞(磁盘排队是堵塞的一个特征,在本文的后续部分将做深入
的讨论)。
6
仔细分析消耗系统资源的
Microsoft SQL Server 组件,
可以进一步优化 SQL Server
消耗 CPU 和磁盘 I/O 资源的组件 的性能。
工作线 程
Microsoft SQL Server 调整 Windows 操作系统线程池,来处理提交到数据库服务器
的 SQL Server 批处理命令。这些可以提供所有批处理命令服务的全体线程(称为
工作线程)是通过设置 sp_configure 的 max worker threads 选项来描述的。如果提
交的活动批处理命令数目大于 max worker threads 指定的数目,工作线程将被动态
提交的批处理命令连接(connections actively submitting batches)共享。缺省设置
255 在大多数安装情况下工作得很好。
懒书写 器(lazy Writer)
SQL Server 懒书写器帮助产生空缓冲区,也就是一个不包含任何数据的 8KB 高速
缓存页面。每当懒书写器把一个 8KB 的缓冲区的内容存到磁盘时,它都会初始化
该缓冲页标识,以使其它数据可以写进该空缓冲区。懒书写器在磁盘 I/O 请求较少
的时候产生空缓冲区,为以后使用磁盘 I/O 资源作好准备,而且对其它 SQL Server
操作产生的影响最小。
SQL Server 7.0 自动配置和管理空缓冲区的数目。监测 SQL Server: Buffer Manager
Free Buffers 对象,保证空缓冲区的数目保持稳定。懒书写器调整缓冲区的数目,
使其满足用户对空缓冲区的要求。SQL Server: Buffer Manager Free Buffers 对象
应该不会降低到 0,因为如果这样的话, SQL Server 懒书写器将总不能满足用户提
出的空闲缓冲区要求。
如果懒书写器不能保持空闲缓冲区资源的稳定,或者说不能始终保证可以提供空闲
缓冲区,这将意味着磁盘子系统的懒书写器不能始终提供磁盘 I/O 功能,那么需要
调整空闲缓冲区的数目(把这种空闲缓冲区数目减少的现象与任何其它确认是由磁
盘子系统问题引起的磁盘排队现象相比较)。解决磁盘排队问题的一种方法是为数
据库服务器磁盘子系统增加更多的物理磁盘(也称做 spindles ),为其提供更强的
I/O 处理能力。SQL Server: Buffer Manager – Lazy Writes/sec 对象表示的是懒书写
器写到磁盘的 8KB 页面数。
在性能监控器中监控当前磁盘队列的长度,这是通过查看平均磁盘队列(Disk:
Average Disk Queue )或 当前磁盘队列(Current Disk Queue) 计数器的值(物
理的或逻辑的)得到的,以保证每一个与任何 SQL Server 动作相联系的物理磁盘的
队列长度都在小于 2。对于配置有硬件 RAID 控制器和磁盘阵列的数据库服务器,
7
应该将磁盘计数器报告的数目(逻辑的或物理的)除以实际硬盘数目(这里的硬盘
数目可以从逻辑驱动器盘符得到,或者从 Windows NT® 磁盘管理器程序提供的物
理硬盘数得到)。因为 Windows 与 SQL Server 根本不考虑连到 RAID 控制器的实际
物理硬盘数目。而你却应当知道与 RAID 磁盘阵列控制器相连的驱动器数目,因为
这样才能明白性能监测器报告中的磁盘排队。
若想获取更多资料,请参考 SQL Server 7.0 联机帮助中的以下主题:清空缓冲区页、
写缓冲区页、写优先事务处理日志。
检查点
检查点(Checkpoint)操作将不洁净页写到 SQL Server 数据文件中。不洁净页指的
是在高速缓存中被修改的页。这些页被写到磁盘后,并没有从缓冲区中清除, 因此
用户仍然可以在高速缓存中直接读取或者修改这些页面,而不需要从磁盘中重新读
出来,这与懒书写器创建空闲缓冲区的方法不同。
检查点操作让工作线程和懒书写器做大部分清空不洁净页的工作。它会保持等待,
一直等到一个特别的检查点,才清空不洁净页。这样为工作线程和懒书写器提供了
更多的清空不洁净页的时间。SQL Server 文档中对这种额外等待时间的发生条件有
详细描述。检查点操作通过额外的检查点等待时间使 SQL Server 磁盘 I/O 活动在
较长时间段内达到均衡。
当有许多页涌入到高速缓存时,为使检查点工作更加有效,SQL Server 将数据页按
磁盘上的顺序排序。这种排序将尽量使磁盘臂移动距离最小,尽量允许检查点操作
利用顺序磁盘 I/O 的优势。检查点操作也可以直接向磁盘子系统提交异步 8KB 字
节的磁盘 I/O 操作的请求。这样做可以使 SQL Server 更快地完成所需磁盘 I/O 请求
的提交,因为检查点操作不需要等待磁盘子系统做出数据实际已经写到磁盘的报告。
使用 max async IO 选项可以改善检查点操作时过量不洁净页涌入的情况。
sp_configure 的 max async IO 选项控制特定 8KB 高速缓存的数目,这些高速缓存
指的是检查点操作可以同时向 Windows 操作系统以及依次向磁盘 I/O 子系统提交的
缓存。如果磁盘队列的长度长到不可接受,那么减小 max async IO 选项的值。如
果 SQL Server 必须维持 max async IO 选项的当前值,那么为磁盘子系统增加磁盘
数目,直到磁盘队列的长度缩短到可以接受的水平。
如果你必须提高 SQL Server 执行检查点操作的速度,并且磁盘子系统有足够的能
力——可以在不引起磁盘排队等待就能处理增加的磁盘 I/O 操作,那么可以增大
max async IO 选项的值,以允许 SQL Server 提出更多的异步磁盘 I/O 请求。在你改
变 max async IO 选项值之后,请认真观察磁盘排队计数器。除了观察磁盘写队列,
8
还要观察磁盘读队列。如果 max async IO 选项对磁盘子系统来说设置得过高,检
查点操作可能会引起磁盘写 I/O 请求排队,这也将导致 SQL Server 读操作的堵塞。
性能监控器中的物理磁盘对象和逻辑磁盘对象提供了“平均磁盘读队列长度”
(Average Disk Read Queue Length )计数器,它可以用来监测磁盘读 I/O 请求的
排队情况。如果磁盘读队列是由检查点操作引起的,你可以减小 max async IO 选
项的值,或者增加硬盘驱动器数目,以便同时处理检查点操作和读请求。
日志管 理器
象其它重要的关系数据库管理系统(RDBMS)产品一样, SQL Server 同样也保证
所有在数据库上执行的写操作(插入、修改、删除)在遇到异常中断情况时(例如:
电源掉电、磁盘损坏、数据中心失火等等),数据不会丢失。 SQL Server 的日志
处理可以保证恢复数据。在任何隐含的(单独的 SQL 查询)或者显式的(发出
BEGIN TRANSACTION, COMMIT 或 ROLLBACK 命令的事务处理)事务处理完成
之前, SQL Server 日志管理器一定要从磁盘子系统接收一个信号,表明所有与事
务处理相联系的修改数据都成功地写到了相关的日志文件中。这一规则保证了当服
务器遭遇突然停机,高速缓存上的内容还没有来得及写到数据文件中去,然后在重
新开机时,可以通过读取事务处理日志来恢复数据文件。填充数据缓存是检查点操
作或懒书写器的工作。服务器中断后读事务日志文件、进行 SQL Server 事务处理的
过程称之为恢复(recovery)。
为获取最高性能,如果高速缓存控制器可以保证它里面的数据最终都将写到磁盘上,
甚至在电源掉电的情况下也能保证,那么你可以为 SQL Server 日志文件使用高速缓
存控制器。若想获取有关高速缓存控制器的更多资料,请参阅将在本文档后面部分
讨论的“硬件 RAID 控制器内嵌高速缓存的影响(Effect of OnBoard Cache of
Hardware RAID Controllers)”。
若想获取更多资料,请参考 SQL Server 7.0 联机帮助中的以下主题和/或关键字:事
务处理恢复,优化事务日志性能,日志管理器对象。
预读管 理器
Microsoft SQL Server 7.0 预读管理器是完全自配置与自调整的。预读管理器与 SQL
Server 查询处理器紧密结合。SQL Server 查询处理器(Query Processor )会识别那
些适合预读操作的情况。对较大表的扫描、大范围索引的扫描、查看 B 树中的簇索
引与非簇索引,这些情形都适合预读操作。预读操作每次读 64KB I/O,相对于 8
KB I/O 而言,为磁盘子系统提供了更高的磁盘流量。当需要从 SQL Server 检索大
量数据时,预读操作是最佳的方案。
预读管理器得益于使用更加简单、更加高效的索引分配表(Index Allocation Map –
IAM)存储结构。IAM 是 SQL Server 7.0 的新方法,用来记录范围(8 页 SQL
9
Server 数据信息或者索引信息,最大长度是 64 KB)的位置。IAM 是一个 8KB 的
页面,使用位图这样的紧缩格式表示索引数据。紧缩格式的 IAM 页面的存取速度
很快,常用的 IAM 页面保存在高速缓存中。
预读管理器可以结合来自查询处理器的联合查询信息,创建多个读请求序列,并且
快速地检索所有范围的位置,这要从 IAM 页面中读取。序列化的 64KB 磁盘读操
作提供了极好的磁盘 I/O 性能。
预读动作由 SQL Server: Buffer Manager Readahead Pages 计数器监测。执行
DBCC PERFMON (IOSTATS)命令,你可以得到有关预读活动的更多信息。其中一
部分提供了 RA Pages Found in Cache 和 RA Pages Placed in Cache。如果页面已经被
哈希处理(应用程序先读到它,预读操作浪费一次读操作),那么它就是在高速缓
存中找到的页面。如果页面没有被哈希处理(顺利的完成预读),那么它是放在高
速缓存中的页面。
过多的预读操作会影响整体性能,因为它会在高速缓存中放入一些不必要的页面,
要求额外的 I/O 与 CPU 资源,而这些资源本可以用在其它地方。对这个问题的解决
是性能转换的目的,所有的 TransactSQL 查询都将被转换,以使高速缓存中的页面
数达到最少。这包括对合适的任务使用合适的索引。为有效的范围扫描保存簇索引、
定义非簇状索引,以此来协助快速定位单独行,或者少数的若干行。
当你配置一个只包含几兆字节数据的 SQL Server,而且此
SQL Server 不需要处理大量的读操作和写操作时,你不用过
磁盘 I/O 性能 多地考虑磁盘 I/O,也不用考虑使用多个硬盘来平衡 SQL
Server I/O 的活动以达到最佳性能。但是,当你创建较大的
SQL Server 数据库,比如说包含数百兆字节的数据,并且/或者需要处理大量的读
和/或写操作时,你必须通过使用多个硬盘来平衡 SQL Server I/O 的活动,以配置
SQL Server 使其磁盘 I/O 性能达到最佳。
这一计算表明如果在一个硬盘驱动器上做严格的单独页面读写操作,你只会得到不
超过每秒 600 KB 的 I/O 处理能力。这远远低于所宣布的每秒 40 MB 的硬盘处理速
度。SQL Server 工作线程、检查点、及懒书写器都是用 8KB 的传输块来执行 I/O
操作的。
10
这一计算标明如果在一个硬盘驱动器上做严格的顺序单独页面读写操作,你会得到
不超过每秒 1200 KB (1.2 MB)的处理能力。
这一计算表明如果在一个硬盘上做严格的顺序读写操作,你会得到不超过每秒 9.6
MB 的处理能力。这比随机 I/O 情况要好得多。SQL Server 预读管理器以 64KB 的
传输率执行磁盘 I/O,安排读操作,因此预读(通常称为顺序化或按磁盘顺序)的
扫描是顺序执行的。尽管预读管理器顺序化执行 I/O 操作,页分离仍使得读操作非
顺序化。这是需要尽量消除和防止页分离的一个原因。
日志管理器按顺序填写日志文件,使之最大达到 32 KB。
顺序与 非顺 序磁 盘 I/O 操作
术语顺序与非顺序(随机)用来针对于硬盘驱动器的操作。一个单独的硬盘驱动器
由一组盘片组成,每一个盘片都通过一套读写头提供读写操作的服务,读写头可以
在盘片上移动,从盘片上读数据,或者向盘片写数据。记住有关硬盘驱动器和 SQL
Server 的以下几点:
若想获取关于物理硬盘驱动器的更多资料,请参阅 Compaq 的文献:“磁盘子系统
性能及其可变性”。参考本文档后面的“查阅更多资料”部分,将告诉你如何得到
此文献。
11
磁盘 I/O 传输 率和 PCI 总线 带宽
一个典型的硬盘提供了大约每秒 40MB 或者每秒 75 次随机存储/150 次顺序存储的
最大传输率。所宣称的典型的 RAID 控制器大约有每秒 40MB 或每秒 2000 次的传
输率。所宣称的 PCI 总线有大约每秒 133MB 或更高的数据传输率。设备实际获得
的传输率与所宣称的通常会有一定的差别。你应当懂得如何通过这些传输率来决定
与每个 RAID 控制器相连的硬盘设备的数目,以及在不造成 I/O 瓶颈的情况下,可
以有多少个磁盘驱动器和 RAID 控制器与 PCI 总线相连。
我们在前面已经计算得到读写到一个硬盘驱动器的 SQL Server 数据的最大速率是
每秒 9.6 MB。假设 RAID 控制器可以处理每秒 40MB,你可以用 40 除以 9.6 大约得
到 4,便是连接到 RAID 控制器的硬盘驱动器的数目。这意味着当 SQL Server 只是
做 64KB 字节的顺序 I/O 操作时,与一个 RAID 控制器连接的硬盘驱动器的最大数
目是 4。类似的,我们计算 64KB 随机 I/O 的情况,从硬盘驱动器到控制器的最大
数据传输率是每秒 4.8MB。40MB 除以每秒 4.8MB,得到的结果是 8。这意味着在
随机 64KB I/O 情况下,与一个控制器相连的硬盘驱动器的最大数目是 8。随机 8
KB I/O 情况下 数据传输要求的驱动器数目最多。40 除以 0.6 得到结果 66,RAID
控制器连接 66 个硬盘驱动器可以使 8KB 字节的读写达到饱和。当然这种情形是不
现实的,因为预读和写日志使用大于 8KB 字节的传输尺寸,而且 SQL Server 也不
可能完全执行随机 I/O 操作。
你还可以通过查看磁盘每秒的操作次数,而不是每秒多少兆字节,来决定与 RAID
控制器相连的驱动器数目。如果硬盘驱动器可以有每秒 75 次的非顺序(随机)I/O
操作,那么 26 个硬盘驱动器一起工作原则上将产生每秒 2000 次的非顺序 I/O 操作,
或者说足够达到单个 RAID 控制器的最大处理能力。 同样,因为单个硬盘驱动器
可以处理每秒 150 次的顺序 I/O 操作,那么将需要 13 个硬盘驱动器一起工作以达到
每秒 2000 次的顺序 I/O 操作。
RAID
当数据库的容量大于几兆字节时,就很有必要对 RAID (廉价磁盘冗余阵列)技术、
以及它与数据库性能的关系做一个基本的了解。
12
• 高性能
• 容错性
RAID 提供了对硬盘提供错误保护和数据恢复,使用两种方法:镜像和奇偶校验。
镜像是通过向两个驱动器写信息,一个作为另一个的镜像来实现的。如果镜像
驱动器中的其中一个驱动器中的数据丢失,丢失的数据可以从相应匹配的驱动
器中得到。在 Windows 和 SQL Server 不脱机状态下(称为具有“热插拔(Hot
Plug) ”)功能的驱动器),大多数 RAID 控制器可以替换一个发生错误的驱
动器,从相应的镜像驱动器中为其恢复数据。当要求具有容错性时,镜像是
RAID 最佳的解决方案。镜像情况下,每个 SQL Server 写操作实际上都要 进行
两次写操作,分别写到镜像对的两边。镜像提供的容错性超过 RAID 的奇偶检验
的容错性。镜像功能可以使服务器在一个磁盘发生错误的情况下仍能继续工作,
并且镜像磁盘中若有一半的磁盘发生错误,它仍可以使系统管理员在不关掉服
务器的情况下,从文件备份中恢复发生错误的磁盘。镜像的缺点是开销过大。
镜像对磁盘的开销要求是:要求两组磁盘都保存有全部数据。RAID 1 和它的衍
生体 RAID 0+1,都是通过镜像功能实现的。
奇偶校验是通过计算写在磁盘上的恢复信息来实现的,这个恢复信息保留在组成磁
盘阵列的一个专门磁盘上,与该磁盘阵列中其它磁盘上的信息共同满足奇偶校验。
如果一个磁盘发生了错误,则在 RAID 磁盘阵列中换入一个新盘,用恢复信息(满
足奇偶校验)将坏盘的内容恢复到新盘上。RAID 5 和它的衍生体都是通过奇偶校
验来实现的。奇偶校验的优点是开销较低。使用 RAID 5,只需要一个额外的磁盘
就可以保护任意数目的磁盘。校验信息均匀分布于组成 RAID 5 的所有磁盘上。奇
偶校验的缺点是性能不高以及容错性不高。因为做校验需要额外的计算开销和写开
销,RAID 5 对每个 Windows NT 和 SQL Server 的写操作都要求四次磁盘 I/O 操作,
而镜像则只需要两次。I/O 读操作的开销与镜像相同。同样的,RAID 5 也仅能在一
个磁盘发生错误的情况下维持工作,而从备份磁盘中恢复数据的工作则需要脱机进
行。
硬件 RAID 控制器自带高速缓存的影响
许多硬件 RAID 控制器有多种读与/或写高速缓存方式。充分利用这种高速缓存能
力,可以提高磁盘子系统的有效 I/O 处理能力 。这些基于控制器的缓存机制的原
理是集合较小的、非顺序的 I/O 请求,这样传到硬盘的批量 I/O 请求可以组成较大
的(32 128 KB)、而且有可能是顺序的 I/O 请求。这样有助于:在硬盘到 RAID
控制器的 I/O 数目一定的情况下,可以达到更大的数据流量。RAID 控制器缓存正
是极好地利用了硬盘的 I/O 处理能力,来安排 I/O 请求的。
RAID 控制器通常依靠它们的备份功能来保护它们的缓存机制。备份功能指的是在
电源掉电的情况下,可以在一段时间内将写在高速缓存中的数据保存下来。在实际
13
工作环境中,如果服务器掉电,备份功能将向服务器提供足够的 UPS 保护,从而
提供给数据库服务器更多的保护,将数据库服务器上的数据存到磁盘上。
RAID 级别
在所有的 RAID 级别中,RAID 1 和 RAID 0+1 提供最佳数据保护和最佳性能,但
是它要求较多的磁盘开销。当不需要过多地考虑硬盘价格问题时, RAID 1 或
RAID 0+1 是同时满足高效性和高容错性的最佳选择。
RAID 5 在花费最小的情况下提供了容错功能,但是它的磁盘写效率只有 RAID 1 和
RAID 0+1 的一半,因为 RAID 5 在处理校验信息时,需要额外的磁盘写操作。
RAID 5 的容错性不及 RAID 1 和 RAID 0+1。
使用 RAID 0 (没有容错性保护的磁盘划分)可以获得最佳效率。但是因为它没有容
错性保护,这种 级别的 RAID 只用在数据库开发环境或者某些测试环境中。
普通 RAID 等级
14
联机 RAID 扩充
联机 RAID 扩充是 RAID 的一个特征,它指的是只要有空闲的热插拔插槽,就可以
在不退出 SQL Server 的情况下,动态地向 RAID 磁盘阵列中添加磁盘。许多硬件供
货商都为它们的 RAID 控制器在硬件上实现这一功能。数据将自动在所有磁盘上重
新均匀分块,其中包括新加入的磁盘,而且不需要关掉 SQL Server 或者
Windows。只要在磁盘阵列 容器中留出空闲插槽就可以使用这一功能。这样,如
果 SQL Server 向 RAID 磁盘阵列提出的 I/O 请求总是超过标准(可以通过观察与
RAID 磁盘阵列相联系的 Windows 逻辑驱动器的磁盘队列长度得到),那么可以在
不影响 SQL Server 运行的情况下,向热插拔插槽中加入一个或多个硬盘。RAID 控
制器向这些新插入的磁盘重新分配某些 SQL 数据,以使 SQL 数据均匀分布于
RAID 磁盘阵列的所有磁盘上。这样,RAID 磁盘阵列的总体 I/O 处理能力增强了,
包含进了新磁盘的 I/O 处理能力(每个磁盘每秒 75 次非顺序 I/O 操作,或者 150 次
顺序 I/O 操作)
性能监控器和 RAID
在性能监控器(Performance Monitor)中,逻辑磁盘对象和物理磁盘对象提供相同
信息。不同点是:性能监控器中的逻辑磁盘与 Windows NT 中的逻辑磁盘的相对应;
性能监控器中的物理磁盘与 Windows NT 中的单个物理磁盘相对应。
在命令行窗口使用 diskperf.exe 命令,可以实现性能监控器的计数功能。如果加一
个开关项: diskperf –y ,那么当只使用硬盘、或者 RAID 控制器与硬盘同时使用
时,性能监控器可以报告逻辑盘数目和物理盘数目,而不需使用 Windows NT 的软
件 RAID 方法。
15
若不考虑 I/O 产生的问题,监测磁盘排队是一个最佳方案。Windows 操作系统不知
道 RAID 磁盘阵列中的物理磁盘数,因此,为准确评估每个物理磁盘的磁盘排队情
况,需要将磁盘队列的长度除以 RAID 磁盘阵列中包含的物理磁盘数。将这一数据
保存在包含有 SQL Server 文件的两个硬盘中。
Windows NT 软件方式 RAID
Windows NT 通过 Windows NT 操作系统,而不是硬件 RAID 控制器,实现镜像组
(mirrorset)和磁盘分块(stripeset),从而为硬盘提供了容错功能。Windows NT
磁盘管理器既可以定义镜像组(RAID 1),又可以定义使用奇偶校验的磁盘分块
(RAID 5)。Windows NT 磁盘管理器还允许定义没有容错功能的磁盘分块 (RAID
0)。
并行磁 盘 I/O
对存储在少数硬盘上的较小 SQL Server 数据库来说,磁盘 I/O 并行机制对性能没有
什么影响。但对存储在多数硬盘上的大数据库来说,磁盘 I/O 并行机制使得磁盘子
系统的 I/O 处理能力得以充分利用,大大提高了性能。
Microsoft SQL Server 7.0 引入了文件与文件组的概念,以此来代替 SQL Server 早期
版本的设备模型和段模型。文件和文件组为经过磁盘或 RAID 磁盘阵列的数据传输
提供了更加便利的方法。若想获取更多资料,请参考 SQL Server 7.0 联机帮助中的
以下主题:为文件组加索引,为文件组、文件与文件组建表,使用文件和文件组管
理变化的数据库。
16
磁盘驱动器池技术简化了 SQL Server I/O 的性能转化,因为数据库管理员知道只在
一个物理位置创建数据库对象。观察单个设备池,可以了解磁盘排队情况,如果需
要的话,可以在设备池中加入更多的硬盘设备来减少磁盘排队现象的发生。这一技
术可以在不清楚数据库哪一部分利用率最高的情况下达到优化效果。不要隔离其它
磁盘分区提供的 I/O 处理能力,因为 SQL Server 可能有 5%的时间是用它们来做 I/O
操作的。单个磁盘驱动器池技术可以为所有 SQL Server 操作提供合适的 I/O 处理能
力。
• 事务日志文件
• 临时数据库( tempdb)
• 数据库文件
• 与查询动作和写动作联系的表
• 与大量查询动作和写动作相联系的非簇索引
在加载测试或者加载大量任务期间,当性能监控器报告发生排队现象时,使用这一
配置可以将磁盘排队与不同的 RAID SCSI 通道以及磁盘驱动器仓联系起来。如果
RAID 控制器和磁盘驱动器仓支持联机 RAID 扩展, 并且磁盘驱动器仓中有空闲热
插拔插槽,可以通过向 RAID 磁盘阵列中添加一定数目硬磁盘的办法解决磁盘排队
问题,具体数目根据性能监控器的报告而定,应使报告中磁盘队列中的磁盘数降到
可以接受的水平(对 SQL Server 来说应少于 2)。这一工作可以在不影响 SQL
Server 运行的情况下进行。
17
tempdb 数据库由 SQL Server 创建,是各种操作的共享工作区,包括临时表操作、
用 GROUP BY 或 ORDER BY 命令做排序、子查询、集合操作、用 DISTINCT(必
须创建临时表以删除多余行)命令查询、指针操作、哈希表操作。应当使 tempdb
数据库的 I/O 操作可以与同事务处理有关的 I/O 操作并行处理。因为 tempdb 是一
个临时工作区,可以不断修改,选择 RAID 1 或 RAID 0+1 比选择 RAID 5 更为合适。
每次数据库服务器重新启动都要重新创建新的 tempdb 数据库,因此对 tempdb 来
说,可以在开发阶段为 tempdb 使用 RAID 0 方式。RAID 0 为 tempdb 数据库使用
最少的物理磁盘,因而提供了最佳的 RAID 性能。在开发环境中为 tempdb 使用
RAID 0 需要考虑以下事实:在 RAID 0 方式下,当物理磁盘发生错误时,SQL
Server 必须停止运行,重新启动,而在 RAID 1 或 RAID 0+1 方式下则不用。
这部分讲述的是 SQL Server 数据和索引在磁盘上是如何
物理放置的、以及这样的结构是如何影响磁盘 I/O 的性
SQL Server 索引 能的。
18
SQL Server 索引页只包含来自列的数据,列由一个特殊的索引组成,因此索引页可
以将许多行的信息压缩到一个 8KB 的页面中,而不是象数据页那样 8KB 的页面
只能表示 8KB 的数据。索引对 I/O 性能的提高正是通过这种形式的压缩实现的。
如果作为索引的列在数据表中只占有很少的百分比,那么在 8KB 大小 的索引页中
可以压缩更多的信息,这样更提高了性能。当 SQL 查询要求表中的若干行内容,
使索引页的列与数据页的行匹配,那么 SQL Server 可以读索引页来减少 I/O 操作,
然后直接存取满足查询要求的数据页的相应行。这样 SQL Server 在定位要求的行时,
不需要扫描数据表中所有的行 。
下图显示了非簇索引与簇索引的不同点。在非簇索引中,叶节点只包含索引数据。
在非簇索引的叶节点上,索引行包含有指向行数据的指针,该行数据在相应数据页
上。非簇索引在最坏情况下,对每一行的存取都要求额外的非顺序磁盘 I/O 来检索
该行数据;在最好情况下,许多要求检索的行数据都在相同的数据页上,这样检索
若干行只需访问一次页面。簇索引中,索引的叶节点是实际的数据行。这样,在检
索数据表时,不需要做特殊的查找标志。基于簇索引的确定范围扫描有很好的执行
性能,因为簇索引(也就是表中所有行)的叶节点在物理磁盘上是按列顺序排列的,
这些列组成了一个簇索引,可以执行 64KB 以内的 I/O。如果在簇索引 B 树内(非
叶节点层和叶节点层)页面数不多,不会造成页面分割,那么 这些 64KB 的 I/O
在物理上便是顺序存放的。加点的行表示 B 树 结构中没有在图中表示出来的其它
8KB 页面。
簇索 引
每个表只能够有一个簇索引,因为当象非簇索引 B 树结构那样组织簇索引 B 树结构
的顶部时,簇索引 B 树的底层将包含与表有关的实际 8-KB 数据页。以下是性能含
义:
19
• 利用簇索引、基于键值搜索的 SQL 数据检索无需利用书签查找 (和可能的硬盘
位置无序变动)就可以检索相关数据页,因为簇索引的叶层次已经是相关数据页。
• 簇索引的叶层次按照包括该簇索引的列进行排序。由于簇索引 的叶层次包含表
的实际 8-KB 数据页,因此整个表的行数据就按照簇索引所确定的顺序被物理地
安排在磁盘驱动器上。根据簇索引的值从大于 64-KB 的表中取出相当多的行时,
这将提供一个潜在的 I/O 性能优势,因为除非正在对表进行分页,正在使用的
都是顺序磁盘 I/O。有关分页的进一步信息,请参见本文档后面部分的
“FILLFACTOR and PAD_INDEX”。你在表中挑选簇索引时,应该基于某一列,
该列用于执行域扫描以获取数量较多的行。
非簇 索引
对于要从一个大的 SQL Server 表中,根据一个键值取出具有较好选择性的一些行的
情况来说,非簇索引是最有用的。非簇索引是 B 树形式的 8KB 索引页。索引页 B
树的底层或叶层次包含所有来自包含该索引列的数据。当使用一个非簇索引来检索
与键值相匹配的表的信息时,遍历索引 B 树,直到在索引的叶层次找到匹配键。如
果需要来自表中的列(该列不构成索引的一部分)时,则将进行书签查找。书签查
找可能会需要一个磁盘的无序 I/O 操作。如果表及其附带的索引 B 树很大,就可能
还需要从另一个磁盘中读取数据。如果多个书签查找都链接到相同的 8KB 数据页
上,那么能够减少 I/O 性能损失,因为只需一次性地将该页读取到数据高速缓存中。
对于 SQL 查询所返回的每一行(该查询与查找非簇索引有关),都需要一个书签
查找。对于只从表中返回一行或少数行的 SQL 查询而言,这些书签查找使得能够
更好地对非簇索引进行归类。对于需要返回许多行的查询而言,簇索引更有用处。
覆盖 索引
覆盖索引是非簇索引的一种特殊情况。覆盖索引就是一个非簇索引,但是它建立在
满足 SQL 查询所需的所有列上,查询可以在选择标准中,也可以在 WHERE 子句
中。覆盖索引可以节约 I/O,并且能够提高查询性能。但是你应该在创建一个新索
引所花费的代价(包括对与其相关的 B 树索引结构进行维护所需要的代价)和覆盖
索引所能带来的 I/O 性能收益之间进行权衡。如果对于经常在 SQL Server 上运行的
一个查询或一组查询来说,覆盖索引是有用的,那么创建覆盖索引就很值得。
示例:
SELECT col1,col3 FROM table1 WHERE col2 = 'value'
CREATE INDEX indexname1 ON table1(col2,col1,col3)
或者
20
• SQL Server 从索引页而不是数据页得到所需要的数据,从而数据压缩比例更大,
而且 SQL Server 将节约磁盘的 I/O 操作。
• 利用 col2, 覆盖索引将需要的数据组织到磁盘上。硬盘驱动器按照顺序返回与
WHERE 子句(col2 = 值)有关的所有索引行,这样就能实现更好的 I/O 性能。从
磁盘 I/O 的角度来看,一个覆盖索引就是此查询和其它查询的一个簇索引,它完
全能由覆盖索引中的列实现。
如果索引中所有列的字节数比该表中单行的字节数小,而你又能确信利用覆盖索引
进行的查询将会很顺畅,那么使用覆盖索引就是很明智的。但是,在构建大量的覆
盖索引之前,需要考虑 SQL Server 7.0 如何才能有效地、自动地迅速为查询创建覆
盖索引。
自动 的覆 盖索 引或覆 盖查 询
Microsoft SQL Server 7.0 Query Processor 提供了索引交集。索引交集允许查询处理
器兼顾到给定表中的多个索引,构建一个基于这些多个索引的散列表,利用散列表
来缩减查询的 I/O。索引交集生成的散列表就是一个覆盖索引,它能提供与其它覆
盖索引一样的 I/O 性能。索引交集给数据库用户环境提供了更大的灵活性,在该环
境中要确定所有运行于此数据库之上的查询是很困难的。在这种情况下,一个较好
的策略是定义单一的列,并且定义关于所有经常要被查询的列的非簇索引,让索引
交集来处理需要覆盖索引的情况。
示例:
SELECT col3 FROM table1 WHERE col2 = 'value' 或者
CREATE INDEX indexname1 ON table1(col2)
CREATE INDEX indexname2 ON table1(col3)
在 SQL
Server Enterprise Manager 中,使用 Create Index Wizard。
索引 选择
选择索引的方式会极大地影响产生的磁盘 I/O 次数,从而影响到 I/O 性能。非簇索
引对于少数行的检索是合适的,而簇索引则适合于域扫描。另外,你应该使索引尽
量简洁(使用最少的列和字节),对于簇索引尤其如此,因为非簇索引是利用簇索
引来查找行数据的。有关进一步的信息,请参见 SQL Server 7.0 联机手册中的下列
主题:使用簇索引(Using Clustered Indexes),索引调整建议(Index Tuning
Recommendations)和设计索引(Designing an Index)。
必须考虑到非簇索引的选择性,因为如果非簇索引是利用少数单一值的,并且创建
于一个较大的表之上,那么在检索数据的过程中使用非簇索引就不能节约 I/O 了。
实际上,使用索引将导致比顺序表扫描更多的 I/O。非簇索引可能的选择项包括发
票号码,单一顾客号,社会安全号和电话号码。
21
对于匹配列的查询、或者搜索单一值很少的列域查询而言,簇索引比 非簇索引要
好得多,因为簇索引本身对表的数据进行了排序,而且允许关于键值的 64KB 的
I/O。簇索引可能的选择项包括国家,公司分支机构,销售日期,邮政编码和顾客
所在地。定义关于具有单一值的列的簇索引是不明智的,除非系统的典型查询能检
索到较大范围内的单一值。选取每个表中最好的列来创建簇索引,这一行为取决于
是否具有多个查询,这些查询必须能取出基于这些列的顺序的很多行。对于每个用
户环境而言,答案是很明显的。一个公司可能做更多的基于数据域的查询,而另一
个公司可能会做许多关于分支银行域的查询。
簇索 引选 择
簇索引选择实际上包括两个步骤。首先,向域扫描提供顺序 I/O,以便确定表中那
些能够从簇索引得到好处的列。接着,利用簇索引来影响表中数据的物理位置安排,
此时要避免热点(hot spot)。热点的产生是由于当数据放置于硬盘之上时,有若
干个查询同时想在数据所在硬盘的同一个区域内对该数据进行读取和写入操作。这
就导致了磁盘瓶颈,因为硬盘收到了超过它所能处理的多个并发磁盘 I/O 请求。解
决方法是要么停止从此磁盘检索那么多的数据,要么将数据散布到多个磁盘上以满
足 I/O 要求。对于在成百上千个 SQL Server 用户之间更好地进行数据的并发存取而
言,有关数据物理位置安排的考虑是很关键的。
这两个解决方案往往是互相冲突的,故而最好的解决方案是协调均衡好两者的关系。
在高用户负载的环境下,与通过在列上加入簇索引以改善性能相比,通过热点来提
高并发性要更有价值。
对于 SQL Server 7.0,在表中有簇索引的情况下,非簇索引将使用簇索引来查找数
据行。由于所有的非簇索引,都需要在其 B 树结构中保持簇键,所以最小化键的字
节大小能够改善性能。请保持簇索引中列的数量最小,并认真考虑包括在簇索引中
的每一列的字节大小,这将有助于缩减簇索引的大小,从而缩减表中所有非簇索引
的大小。越小的 B 树结构可以读得越快,这有利于提高性能。有关进一步的信息,
请参见 SQL Server 7.0 联机手册中的下列主题:使用簇索引(Using Clustered
Indexes)。
另一个方法是从热点位于选择的上下文之中这一思想入手。如果许多用户利用非常
接近但却并不在同一行的键值来选择数据,那么大部分磁盘 I/O 将在磁盘 I/O 子系
统的物理区域内发生。通过为该表将簇索引定义到某一列中(该列可在磁盘上更均
匀地散布这些键值),这一磁盘 I/O 行为可以更均匀地散布开来。如果所有选择使
用的都是同一个单一键值,那么使用簇索引将不能均衡此表的磁盘 I/O。通过使用
RAID (既可以是硬盘也可以是软盘)将 I/O 散布到多个磁盘驱动器上,你可以缓解这
一问题。这一行为可以归结为磁盘存取问题,而不是封锁问题。
22
簇索 引选 择方 案
一个方案可以阐明簇索引选择。例如,一个表中包含有一个发票日期列,一个单一
发票号码列和其它数据。每天大约有 10,000 个新记录要插入到这个表中, SQL 查
询经常要搜寻这个表的所有记录以得到一个星期以来的数据。有许多用户对此表进
行并发存取。发票号码不是簇索引的选择项。发票号码是单一的,用户并不经常搜
寻发票号码域,因此在磁盘上顺序存放发票号码是不合适的。同时,发票号码值单
调递增 (1001,1002,1003,依次递加)。如果簇索引按发票号码设置,则在同一个
磁盘物理位置,在表的末尾、最大发票号码之旁,将会发生多个新行的插入,这将
导致一个热点。
关于此方案没有完美的解答。你可以按发票日期放置簇索引,从而虽然有热点的危
险,但是能够加速与发票日期域有关的查询。 在这种情况下,你可以监控磁盘上
与此表有关的磁盘队列,随时发现可能的热点。推荐你按发票日期定义簇索引,因
为域扫描的优点是基于发票日期的,从而发票号码在磁盘上不是顺序排列的。
在本示例中,一个表包含发票号码,发票日期,发票数量,产生销售的销售部门以
及其它数据。假定每天要插入 10,000 条记录到此表中,而且用户经常根据销售部
门查询发票数量。销售部门应该是创建簇索引的列,因为那是扫描所基于的范围。
最近插入的行将具有销售部门的混合数据;插入应该在表中和表所在的磁盘中均匀
地散布。
在一些情况下,范围扫描可能不成问题。例如,一个大的雇员表有雇员号,社会安
全号和其它数据。插入行时,雇员号依次增加。每天要对此表进行 100,000 次操作,
每次操作就是根据社会安全号取出一行。创建于社会安全号之上的非簇索引在此方
案中提供了非常不错的查询性能。基于社会安全号的簇索引比基于非簇索引所提供
的查询性能要稍微好一点,但是可能有点多余,因为范围扫描并不棘手。如果此表
只有一个索引,则应按社会安全号这一列来放置簇索引。接下来的问题是是否要定
义此表的簇索引。在 SQL Server 的早期版本中,定义表的簇索引是很重要的(即使
查询无需如此),因为这有助于恢复删除了的行的空间。这对于 SQL Server 7.0 空
间分配算法和存储结构而言是不存在任何问题的。
对本示例的建议是创建基于社会安全号的簇索引。理由是社会安全号具有分布式数
据,因而不具有雇员号的顺序模式,社会安全号往往具有较平稳的分布。如果簇索
引创建于此均匀分布的列数据之上,那么雇员记录将均匀地分布在磁盘上。这一分
布,结合 FILLFACTOR 和 PAD_INDEX(这将在今后详加论述),为整个表提供了
开放式数据页来插入数据。假定最近插入的雇员记录具有社会安全号的均匀分布,
则将均匀填写雇员表,避免分页。如果表中不存在具有平稳分布的列,那么在表中
创建整数列并在列中放入均匀分布的值,然后创建簇索引列是很值得的。具有簇索
引的 “filler” 或 “dummy”列不是用来查询的,而是用来在磁盘驱动器间均匀分布
数据 I/O,从而提高表的存取并发性和整体 I/O 性能。这对于大的、存取频繁的
SQL 表而言是一个有效的方法。本示例中另一个可行的解决方案是不创建此表的簇
索引。在这种情况下,SQL Server 7.0 控制着空间管理的各个方面。SQL Server 找
到一个空闲空间以插入行,重用已删除行的空间,并且在需要时自动识别磁盘上数
据页的物理顺序(以允许更大量的 I/O 序列)。数据页的识别在数据库文件自动压缩
的过程中进行。有关进一步的信息,请参见 SQL Server 7.0 联机手册中的下列主题:
管理对象所用的空间和空间分配及重用(Managing Space Used by Objects and Space
Allocation and Reuse)。
23
FILLFACTOR 和 PAD_INDEX
如果正在对一个 SQL Server 数据库进行大量的插入操作,那么你就应该提供并维
持索引和数据页的开放空间,以避免分页。当索引页或数据页不能再容纳更多的新
行,或者由于该页中定义的逻辑顺序必须向页中插入一行时,就会导致分页。发生
分页时,SQL Server 必须将数据分到整个页中,并将大约一半的数据移到新页,从
而两页将具有相同的开放空间。这就耗费了系统资源和时间。
利用性能监控器(Performance Monitor)来监控 SQL Server: Access Methods Page
Splits 计数器。此计数器的值非零则表示发生了分页。进一步的分析要由 DBCC
SHOWCONTIG 语句完成。有关如何使用此语句的进一步信息,请参见 SQL Server
7.0 联机手册中的下列主题: DBCC SHOWCONTIG。
DBCC SHOWCONTIG 语句可以揭示表中是否有过多的分页。扫描密度是 DBCC
SHOWCONTIG 提供的关键指示器。其值应该尽量接近百分之百。如果此值低于百
分之百,可通过使用 DROP_EXISTING 选项整理表以重建表的簇索引 。CREATE
INDEX 语句的 DROP_EXISTING 选项允许重新创建已有的索引,并且它提供的索
引重建性能比删除后再重建索引更好。关于进一步信息,请参见 SQL Server 7.0 联
机手册中的下列主题:创建索引和重建索引( CREATE INDEX and Rebuilding an
Index)。
为 FILLFACTOR 确定的最佳值取决于在一个给定的时间范围内有多少新数据插入
到了 8KB 索引和数据页中。请记住 SQL Server 索引页一般包含比数据页更多的行,
因为索引页只包含与该索引有关的列的数据,而数据页包含有整个行的数据。同时
请考虑维护窗口多久出现一次,此维护窗口允许索引重建以避免分页。当大部分索
引和数据页通过选择表的簇索引填入了数据时,就应该尽量重建索引。如果簇索引
均匀地分布数据,使得可以在整个与表有关的数据页之间插入新行,那么将均匀地
填写数据页。这在分页前提供了时间,你必须重建簇索引。对 FILLFACTOR 的选
择,应部分地基于行(这些行将在一定的时间范围内插入到一个页的键域中)的估
计数目,部分地基于系统中多久会发生一次计划的索引重建。
你必须根据性能平衡,对在页中保留许多开放空间及分页这两者之间做一个抉择。
为 FILLFACTOR 指定一个较小的比例将会给索引和数据页留下较大的开放空间,
这有助于避免分页,但却抵消了将数据压缩到一页中所获得的一些良好性能。如果
在索引和数据页有更多的数据压缩,SQL Server 将会执行得更快一些,因为它能利
用更少的页和 I/O 取出更多的数据。指定过高的 FILLFACTOR 可能会给页面留下过
小的开放空间,还可能使得页面过快溢出,这将导致分页。
24
在使用 FILLFACTOR 和 PAD_INDEX 之前,请记住即便是在联机事务处理(OLTP)
系统中,读取操作也将会超过写入操作。使用 FILLFACTOR 会减慢所有的读取操
作,因为它将表散布到一个大的区域里(缩减数据压缩)。在使用 FILLFACTOR
和 PAD_INDEX 之前,你应当使用性能监控器来比较 SQL Server 读取和 SQL Server
写入,而且只有在写入操作实质上是读取操作的一部分(超过百分之三十)时才能
使用这些选项。
样本数据和工作负载
这个例子说明了如何使用 SQL Server 的性能工具。首先,创建表格:
CREATE TABLE testtable (nkey1 int IDENTITY, col2 char(300) DEFAULT 'abc', ckey1 char(1))
接下来,在表格中装入 10,000 行测试数据:
DECLARE @counter int 这些查询包含
SET @counter = 1 了以下的数据
WHILE (@counter <= 2000) 库服务器工作
BEGIN 负载:
INSERT testtable (ckey1) VALUES ('a')
SELECT ckey1,col2 FROM testtable WHERE ckey1 = 'a'
INSERT testtable (ckey1) VALUES
select('b')
nkey1,col2 FROM testtable WHERE nkey1 = 5000
INSERT testtable (ckey1) VALUES ('c')
INSERT testtable (ckey1) VALUES ('d')
INSERT testtable (ckey1) VALUES ('e') SQL Server 配置
SET @counter = @counter + 1 文件
END
SQL Server 配
置文件记录详细描述了发生在数据库服务器上的活动的信息。SQL Server 可以进行
配置,以观察和记录一个或者多个用户在 SQL Server 上执行的查询,以及提供更多
的可配置性能信息,这些信息包括 I/O 次数的统计,CPU 的统计,封锁请求,SQL
事务和 RPC 统计,索引和表格浏览,提出警告和错误,创建和删除数据库对象,
连接和删除已建立的连接,存储程序的操作,光标操作,以及更多的信息。有关
SQL Serverprofiler 能记录的进一步信息,请参见 SQL Server 联机手册中的关键字:
SQL Server 配置文件(SQL Server Profiler)。
25
以及对将要建立的索引提出建议。索引调整向导不仅能通过调整创建的自动索引来
自动创建数据库的索引,而且可以产生一个 SQL 事务脚本,这个事务脚本可以在
以后进行评价和执行。
下面是分析一个查询负载的步骤:
⇒ 运行 工作 负载 (企业 管理 器)
1. 在 Tools 菜单上,点击 SQL Server Query Analyzer。
2. 连接 SQL Server,并设置将要创建表格的当前数据库。
3. 将下面的查询写到 SQL Server 查询分析器(SQL Server Query Analyzer)的查
询窗口:
SELECT ckey1,col2 FROM testtable WHERE ckey1 = 'a'
SELECT nkey1,col2 FROM testtable WHERE nkey1 = 5000
1. 在 Query 菜单上,点击 Execute。
⇒ 停止 SQL Server 配置文 件
1. 在 File 菜单上,点击 Stop Trace。
2. 在 Stop Selected Traces 对话框中,选择将要停止的跟踪。
26
/* Created by: Index Tuning Wizard */
/* Date: 9/7/98 */
/* Time: 6:42:00 PM */
/* Server: HENRYLNT2 */
/* Database : test */
/* Workload file : E:\Mssql7\Binn\Profiler_load.sql */
USE [test]
BEGIN TRANSACTION
CREATE CLUSTERED INDEX [testtable2] ON [dbo].[testtable] ([ckey1])
if (@@error <> 0) rollback transaction
CREATE NONCLUSTERED INDEX [testtable1] ON [dbo].[testtable] ([nkey1])
if (@@error <> 0) rollback transaction
COMMIT TRANSACTION
这些索引是由索引调整向导为预期的样本表和数据所产生的。ckey1 仅有五个单独
的值,每个值有 2000 行。因为有一个样本查询(SELECT ckey1,col2 FROM
testtable WHERE ckey1=a)需要从基于 ckey1 的一个值的表中进行恢复,所以在
ckey1 列建立簇索引是适当的。第二个查询(SELECT nkey1,col2 FROM testtable
WHEWE nkey1=5000)取得以 nkey1 列的值为基础的一行。nkey1 是唯一的,它有
10,000 行:因此,应该在这一列上建立一个非簇索引。
在含有许多表格和查询的数据库服务器环境中,SQL Server 配置文件和索引调整向
导都是非常强大的工具。当数据库服务器正在进行一个有代表性的查询时,可以用
SQL Server 配置文件记录一个.trc 文件。接着将.trc 文件调入索引调整向导中,以决
定将要建立什么索引比较合适。按照索引调整向导中的提示自动产生和安排索引创
建工作,以使其运行较少的次数。有规律地运行 SQL Server 配置文件和索引调整向
导(如每周一次),能够观察在数据库服务器上执行的查询是否发生了明显的改变,
这样可能需要不同的索引。SQL Server 配置文件和索引调整向导的有规律的使用可
以在查询工作量改变和数据库大小随着过去的时间增加的时候,使 SQL 服务器以
最高的模式运行。
分析 SQL Server 配置 文件 信息
SQL Server 配置文件提供一个将日志信息调入一个 SQL 服务器表格的选项。当选
定时,可以查询表格,以便决定特定的查询中是否用到了过多的资源。
27
有关进一步的信息,请参见 SQL Server 7.0 联机手册中的下列主题:视图和跟踪分
析(Viewing and Analyzing Traces),SQL Server 配置文件的故障解决
(Troubleshooting SQL Server Profiler),使用 SQL Server 的技巧(Tips for Using
SQL Server),一般 SQL Server 配置文件简介(Common SQL Server Profiler
Scenarios),SQL Server 配置文件的启动(Starting SQL Server Profiler),以及用
SQL Server 配置文件进行监控(Monitoring with SQL Server Profiler)。
SQL Server 查询 分析 器
当信息已经记录到 SQL Server 的表格中后,你可以使用服务器查询分析器来决定在
系统上的哪个查询使用的资源最多,从而数据库管理员可以集中精力来提高那些最
需要提高效率的查询。例如,以下这个查询是典型的分析,该分析是建立在从 SQL
Server 配置文件记录到一个 SQL Server 表格的数据上的:
select top 3 TextData,CPU,Reads,Writes,Duration from profiler_out_table order by cpu desc
这个查询找出在数据库服务器上使用 CPU 资源最多的三个程序。随之返回在几毫
秒时间内读写 I/O 次数的信息。如果 SQL Server 配置文件记录了大量的信息,那么
你就应该创建这些表格的索引,以加速查询的分析。例如,如果 CPU 是分析这张
表的一个重要标准,有应该在 CPU 这一列创建一个非簇索引。
I/O 次数 统计
SQL Server 查询分析器(SQL Server Query Analyzer)在 Connections Options 对话框
的 General 标签下面提供一个 Show stats I/O 的选项。如果想要了解在刚刚执行的查
询中消耗了多少的 I/O 资源的信息,请在服务器查询分析器上选定这个检查框。
28
通过移动鼠标指针到该操作的图标上显示出来。等价的信息可以在执行 SET
SHOWPLAN_ALL ON 时,在基于文本的 showplan 上显示。要减少基于文本的查
询优化操作细节,请执行 SET SHOWPLAN_TEXT ON。
有关进一步的信息,请参见 SQL Server7.0 联机手册的下列主题或关键字:理解嵌
套循环连接(Understanding Nested Loops Joins),工作表(worktables)和
showplan。
Showplan 输出示 例
在 SQL 服务器查询分析器(SQL Server Query Analyzer)中使用前面的样本查询和
set showplan_text on 选项:
查询:
SELECT ckey1,col2 FROM testtable WHERE ckey1 = 'a' 基
于文本的 ShowPlan 输出:
|--Clustered Index Seek(OBJECT:([test].[dbo].[testtable].[testtable2]),
SEEK:([testtable].[ckey1]='a') ORDERED)
按照簇索引查找(Clustered Index Seek)的指示,这个查询利用了 ckey1 列上的簇
索引。
29
|--Table Scan(OBJECT:([test].[dbo].[testtable]), WHERE:([testtable].[ckey1]='a'))
等价的图形 showplan 输出:
30
表扫描是从较小的表中重新检索信息的最有效的方式。但在较大的表中,由
showplan 所显示的表扫描是一个警告,该警告提示表可能需要更好的索引或者目
前存在的索引一定要有统计的更新(通过使用 UPDATE STATISTICS 语句)。SQL
Server7.0 提供自动更新索引的方法。由于索引的支持会帮助你保证查询将总是建立
在好的索引统计的基础上,因此你应该让 SQL Server 自动掌握索引统计。
查询:
SELECT nkey1,col2 FROM testtable WHERE nkey1 = 5000
基于文本的 showplan 输出:
31
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([test].[dbo].[testtable]))
|--Index Seek(OBJECT:([test].[dbo].[testtable].[testtable1]),
SEEK:([testtable].[nkey1]=5000) ORDERED)
等价的图形 showplan 输出:
32
按照在 nkey1 列上的索引查找操作的指示,这个查询使用了建立在 nkey1 列上的非
簇索引。书签查找(Bookmark Lookup)操作指出,SQL Server 一定要执行一个从
索引页到表的数据页的书签查找,以取得需要的数据。因为查询所需要的 col2 列不
是非簇索引的一部分,因此,书签查找是必需的。
查询:
SELECT nkey1 FROM testtable WHERE nkey1 = 5000
基于
文本的 showplan 输出:
33
|--Index Seek(OBJECT:([test].[dbo].[testtable].[testtable1]), SEEK:([testtable].[nkey1]=[@1])
ORDERED)
等价的图形 showplan 输出:
性能 监控 器( Performance Monitor):
性能监控器提供了出现在数据库服务器上的关于 Windows 和 SQL Server 操作的信
息。有关 SQL Sever 的特定功能,请参见 SQL Sever 有关文档。
在性能监控器图形模式下,请注明最大最小值。不要太注重平均值,因为两极分化
的数据值将影响这个平均值。研究图形的形状并且同最大最小值比较,将得到对行
为的确切理解。利用 BACKSPACE 将会使计数器更加清楚。
34
性能监控器也会占用一小部分的 cpu 和磁盘 I/O 资源。如果一个系统没有较多空闲
的 cpu 和 I/O 的磁盘资源,则可考虑从另一台计算机上运行监控程序,通过网络监
控 SQL Serve。这仅仅适用于监控程序的图形模式。当使用日志模式时,在 SQL
Server 从本地登录监控程序会更有效。如果你必须通过网络使用日志模式,则可考
虑尽量缩减日志登记,仅仅在最关键的计数器上登记日志。
在性能监控器运行时,你应该把所有有用的计数器记录到一个文件中,以备今后分
析。请配置性能监控器,将所有的计数器记录到一个日志文件中,同时用一种其它
的方式(例如:图形模式)来监控所关心的计数器。然后,在执行程序运行时,所
有的信息都被记录下来,但是最有趣的计数器将显现在一张清楚有序的性能监控器
图形中。
⇒ 启 动日志 记录 (性能 监控 器)
⇒ 停 止日志 记录 (性 能监控 器)
1. 在 Options 上,点击 Log。
2. 点击 Stop Log。
1. 按照将信息放到性能监控器中的步骤进行。
2. 在 Edit 菜单上,点击 Time Window。
35
3. 在 Input Log File Timeframe 对话框中,你可以通过在滚动条上点击并拖住
鼠标,调整记录数据的开始和停止时间窗口。
4. 点击 OK 键重新设置图表,仅仅显示设定时间内记录的数据信息。
关键 的性 能监 控器功 能
你能够观察性能监控器的磁盘计数器。要启用这些计数器,请运行 Windows NT 命
令窗口中的 diskperfy 命令,并且重新启动 Windows NT 。这个 diskperfy 命令确实
会消耗数据库服务器的一些资源,但是我们对所有 SQL Server 提供的产品运行
diskperfy 命令是值得的,因为这样能立即确认磁盘队列问题。并且性能监控器计
数器可以立即用来诊断磁盘 I/O 问题。如果需要磁盘 I/O 次数计数器,则在磁盘 I/O
次数计数器向性能监控器提交数据之前,必须要执行 diskperfy 命令,并且重新启
动 Windows NT 。
如果你使用 RAID,你必须清楚地知道每一个驱动器组中包含了多少物理磁盘驱动器
(Windows NT 将这些驱动器作为一个单独的物理驱动器),这样你就能计算每一
个物理驱动器的磁盘队列长度。询问一个硬件专家,让其解释 SCSI 通道和物理驱
动器分配以便理解每个物理驱动器是怎样容纳 SQL Sever 数据的,以及每个 SCSI
通道被分配了多少 SQL Sever 数据。
在性能监控器中可以查看磁盘队列有几种可选方式。逻辑磁盘计数器与磁盘管理者
(Disk Administrator)指定的逻辑磁盘相联系,而物理磁盘计数器则与磁盘管理者
把什么看成是单个物理磁盘驱动器密切相关。在磁盘管理者的眼中,单个的物理驱
动器可能是单个的硬盘驱动器,或者是包括几个硬盘驱动器的 RAID 组。Current
Disk Queue 计数器是磁盘队列的即时测量值。然而,Average Disk Queue 计数器则是
把性能监控器采样时间内的磁盘排队测量值平均化所得的值。请注意下列情况的计
数器:
逻辑磁盘:平均磁盘队列长度大于2物理磁盘:平均磁盘队列长度大于2逻辑磁盘:
即时磁盘队列长度大于2
物理磁盘:即时磁盘队列长度大于2
36
当这个计数器的值大于 2 时,服务器处理器接到的服务请求就会多得不能把这些请
求作为一组来处理,因此这时 Windows 必须将这些请求排成一个队。
硬 分页 Memory: Pages/Sec > 0 或 者 Memory: Page Reads/Sec > 5
Memory:Pages/Sec 大于 0 或 Memory:Page Reads/Sec 大于 5 意味着 Windows 正准备
到磁盘区去进行内存访问(硬分页错),这要耗费磁盘 I/O 和 CPU 资源。
Memory:Pages/Sec 计数器是 Windows 正在执行的分页数量和数据库服务器 RAM 配
置足够程度的良好指示器。在性能监控器中的硬分页信息子集是每秒钟 Windows
必须读取分页文件以解决内存访问问题的次数。Memory:Pages Reads/See 的值大于
5 是表示执行效率差。
如果 SQL Server 内存正在被手工地配置到数据库服务器上,那么可能需要减少分
给 SQL Server 的内存,从数据库服务器上删除其它应用程序,或者给数据库服务器
增加更多的 RAM。
保持 Memory:Pages/Sec 等于或接近于零有助于数据库服务器的运行,因为
Windows 和它的所有应用程序(包括 SQL Server)并不是正在运行分页文件以满足内
存所需的所有数据。因此服务器的内存量是足够的。一个 Pages/Sec 的值略大于 0
并不可怕,但每次从分页文件中收回而不是从内存中收回数据时,就要付出相对较
高的运行代价(磁盘 I/O)。
37
的读操作比 300 个 4KB 页的读操作更快。对所有磁盘 I/O 进行分析的关键点不仅仅
看磁盘的每秒读写字节数,而且看磁盘的每秒传送次数。有关进一步的信息,请参
见本文档后面部分的“磁盘 I/O 计数器”和“EMC 磁盘 I/O 调整介绍”。
软 分页 Memory: Pages Faults/Sec > 0
如果 Memory:Page Faults/sec 计数器大于 2,这就意味着 Widows NT 正在分页,但
计数器中包括硬分页和软分页,软分页意思是数据库服务器上请求内存页的应用程
序仍然驻留在 RAM 中,但不在应用程序工作集中。Memory: Page Fault/sec 计数器
有助于派生发生软分页的次数。没有一个计数器每秒都监测软分页错误。实际上,
用下面的方法计算每秒发生的软分页错误数目:
Memory: Pages Faults/sec - Memory: Pages Input/sec = Soft Page Faults per Second
要确定 SQL Server 是否正在引起过多的分页,应为 SQL Server 过程监视
process:page faults/sec 计数器并且记录下每秒 Sqiserr.exe 的分页错误数目是否与每秒
页的数目接近。
直到 SQL Server 第一次使用它的所有数据缓存页后,对于每个页的初始化访问才会
引起一个软错误。如果软错误发生在这种情况下,不要着急。有关进一步的信息,
请参见本文档的“Monitoring Processors”。
监控处 理程 序
使服务器所有的处理器保持足够的工作强度以使其性能达到最佳,但不能超负荷而
导致出现处理器瓶颈。性能调整所面临的挑战是要确定出现瓶颈的原因。如果瓶颈
不是因为 CPU,那么问题最有可能出在磁盘子系统,所以就会浪费 CPU 资源。
CPU 是最难扩展到高于特定配置水平(如许多现在流行的系统上的 4 个或 8 个的水
平)的资源,所以 CPU 利用率高于 95%是一个很好的现象。另外,应该控制处理
的回应时间以确保处理是合理的;如果处理不合理,那么高于 95%的 CPU 利用率
可能意味着工作负荷已经超过了现有 CPU 资源的承载能力,以至于需要将 CPU 升
级或者减少或调整工作负荷。
38
当可能出现 CPU 瓶颈时,可以控制的另一个计数器是 System:Context Switches/
sec,因为它标志着每秒钟内 Windows NT 和 SQL 服务器不得不从执行一个进程转
而执行另一个进程的次数。上下文切换是多进程、多处理器环境的标准组成部分,
但是过多的上下文切换会降低系统的效率。只有当出现处理器队列时上下文切换才
会受到关注。当出现处理器队列时,则应用上下文切换作为调整 SQL Server 的标准。
应考虑使用 lightweight pooling 选项以使 SQL Server 从基于线程的计划模式转换到
基于光纤的计划模式。把光纤作为轻量级的线程。用 SPconfigure lightweight
pooling' 1 命令以支持基于光纤的计划。观察处理器队列和上下文切换以控制效果。
磁盘 I/O 次数计 数器
Disk Write Bytes/Sec 和 Disk Read Bytes/Sec 计数器提供各个逻辑驱动器每秒处理
的字节数。将这些数字与 Dbk Reads/Sec 和 Disk Writes/Sec 计数器的值仔细比较。
不要见到一个较小的每秒字节数就认为磁盘 I/O 子系统在闲置。一个单片硬盘驱
动器能够支持每秒总共 75 次无序的和 150 次有序的磁盘读写。
如果性能监控器显示出有些驱动器并不和其余几个驱动器一样繁忙,你可以将 SQL
Server 文件从堵塞的驱动器转移到其它不怎么繁忙的驱动器去处理。这样就可把磁
盘 I/O 活动在各个硬盘驱动器间分配得比较平均。如果一个大的驱动器池被用来处
理 SQL Server 文件,那么比磁盘队列更好的解决方案是通过增加更多的物理驱动器
到这个池中以扩大这个池的读写能力。
39
性 能监控 器图 形输出
这幅图显示了性能监控器用来观察服务器性能的典型计数器。正被观察的是处理器
队列长度计数器。点击 BackSpace 以突出现在被分析的计数器。这样有助于将该计
数器与其它正在被观察的计数器区别开来,并且,当利用性能监控器同时观察多个
计数器的时候,这种帮助就更加明显。
计数器的最大值(Max)可达 22.000。性能监控器图上的最大(Max)、最小
(Min)和平均值(Average)代表的只是如图所示时刻的图形时间(Graph Time)
窗口。图形时间(Graph Time)的缺省值是 100 秒。要想监控较长的时段并且确保
能得到这些时段有代表性的最大、最小和平均值,请使用性能监控器的日志特性。
图上处理器队列长度线的形状说明最大值 22 只出现了很短的一段时间。但是当处
理器最大长度大于 5 时有一个时段保持着 22 这个值,这一段是 100%,而且在 22
这个值之前当图形值大于 25%的时候有一个时段,这一段处理器最大长度的值约为
5。在这个例子中,数据库服务器 HENRTLNT2 只有一个处理器,而且不应承担大
于 2 的处理器最大长度。所以,性能显示这台计算机的处理器已经超负荷工作,而
且应该进行深入的检查以减少处理器的负担或者往 HENRYLNT2 加入更多的处理
器,以处理那些高工作负荷时段的工作。
本节列出了其他可以影响 Microsoft SQL Server 性
能的因素。
其他影 响性能的因 素
40
缓解 网络 交通 和资源 耗费
使用 SQL Server 的相对比较容易使用的接口——例如 Microsoft ActiveX Data
Objects (ADO),Remote Data Objects (RDO)和 Data Access Objects (DAO)——的数
据库编程人员必须注意他们所构建的结果集。ADO、RDO 和 DAO 为编程人员提供
数据库开发界面,无需太多数据库编程经验就可以实现丰富的数据库行集合功能。
当编程人员既不用解释它们返回给客户的数据、也不用始终留意 SQL Server 的索引
放在什么地方以及 SQL Server 的数据是如何安排的时候,他就能解决性能问题。
SQL Server Profiler ,Index Tuning Wizard 和 Show Plan 是发现和解决查询问题的有
用工具。
寻找机会通过删除选择列表中没有必要返回的列,或通过仅返回所需要的行以减小
结果集的大小。这样可以减少 I/O 和 CPU 的耗费。
死锁
如果已经建立了存取 SQL Server 的应用程序,从而事务以与所有用户事务同样的时
间顺序来存取表格,你或许可以避免死锁。在应用程序设计过程中,你应该尽可能
早地将存取的时间表解释给 SQL Server 应用程序开发人员,以避免死锁问题,因为
拖后解决这个问题的代价会非常昂贵。
有关进一步的信息,请参见 SQL Server7.0 联机手册中的以下主题:避免死锁
(Avoiding Deadlocks),发现并解决死锁(Troubleshooting Deadlocking),检测和
解决死锁(Detecting and Ending Deadlocks),和模拟非串行化事务(Analogy to
Nonserializable Transactions)。
查询 中要 避免 的语句
在 SQL 查询中使用不等值操作符迫使数据库使用表扫描来评价这些不相等的值。
如果这些查询用以频繁操作大表,它们将产生大量的 I/O。
将下列语句:
SELECT * FROM tableA WHERE col1 != 'value' 换成语句:
41
SELECT * FROM tableA WHERE col1 < 'value' AND col1 > 'value'
如果索引建立在 col1 上,而不是求助于表扫描,则 SQL Server 可以使用索引(尤
其是簇索引)。
灵活 的规 范化
在频繁访问的表中,可以将数据库应用程序不经常使用的列转移到另一张表。通过
删除尽可能多的列,你能够减少 I/O 次数,并且加强其性能。有关进一步的信息,
请参见 SQL Server 7.0 联机手册中以下主题:逻辑数据库设计和规范化(Logical
Database Design and Normalization)。
分割 视图
你可以通过 SQL Server 7.0 中的视图来水平地分割表。这样,当数据库用户查询整
个视图的某个部分时,就能为 I/O 提供性能优化。例如,如果一张很大的表记录了
所有销售部门一年的销售情况,而从此表中提取数据时只是根据一个销售部门来提
取,则可以使用分割视图。为每一个销售部门定义一张销售表,每张表上的销售部
门栏定义一个限制条件,这样,就创建了一张基于所有表的视图以形成一张分割视
图。查询优化器在销售部门栏中使用已定义过的限制条件。当此视图被查询时,与
所提供的销售部门值不匹配的所有销售部门表都将被忽略,针对这些表的 I/O 也不
被执行。这样,通过减少 I/O 增强了查询性能。
有关进一步的信息,请参见 SQL Server 7.0 联机手册中的以下主题:视图使用说明
(Scenarios for Using Views),创建视图(CREATE VIEW),使用带分割数据的
视图(Using Views with Partitioned Data),通过视图修改数据(Modifying Data
Through a View),复制或录入视图(Copying To or From a View),分割技术
(Partitioning)。
复制 和备 份性 能
如果你能确保磁盘 I/O 子系统和 CPU 运行良好,你就能确保所有 SQL Server 操作
执行情况良好,包括复制和备份。从事务日志文件中读入事务复制和事务备份日志。
快照复制和备份将执行一系列数据库文件扫描。SQL Server 存储结构使这些操作迅
速而有效,只要数据库服务器 CPU 或磁盘子系统没有发生排队等候。
有关进一步的信息,请参见 SQL Server 7.0 联机手册中的以下主题或关键字:优化
备份和存储性能(Optimizing Backup and Restore Performance),创建和存储不同的
数据库备份(Creating and Restoring Differential Database Backups),创建和应用事
务日志备份(Creating and Applying Transaction Log Backups),使用多媒体介质或
设备(Using Multiple Media or Devices),在任务关键的环境中最小化备份和恢复
次数(Minimizing Backup and Recovery Times in MissionCritical Environments),备
份/恢复体系结构(Backup/Restore Architecture),大服务器上的 SQL Server(SQL
Server 7.0 on Large Servers),复制性能(replication performance)。
42
EMC 磁盘 I/O 调节方 案
对于那些在单一 EMC Symmetrix 企业存储系统(EMC Symmetrix Enterprise Storage
Systems)上使用的 SQL Server 数据库系统,一些磁盘 I/O 平衡方法可以帮助避免
磁盘 I/O 瓶颈,并且能够最优化性能。
43
volumes,因为这与用两个物理驱动器(150 无序 I/O / 300 顺序 I/O 通过这两个驱
动器)是相同的。但对于 15 个 hyper-volumes(每个可连接单个的物理驱动器),
SQL Server 使用 15 个物理驱动器来提供 I/O(每秒 1125 无序/2250 顺序 I/O 操作
使用这 15 个驱动器)。
44