表3 关于SET STATISTIC IO 输出结果的描述
ValueDescriptionScan countNumber of scans performedlogical readsNumber of pages read from the data cachephysical readsNumber of pages read from diskread-ahead readsNumber of pages placed into the cache for the query 通过physical reads和read-ahead reads值,可以对某个特定查询涉及的I/O量有一个估计。physical reads和read-ahead reads都表示从磁盘读取的页数。多数情况下,read-ahead reads比physical reads数值要大。 注意在通过SQL Profiler 获取信息时,reads列表示的是逻辑读取量(logical reads),而不是物理读取量(physical reads)。
除了重新对页进行排序,通过增加索引叶级页的页密度,索引的碎片整理还降低执行某个查询的I/O数量。页密度的提高导致完成相同的查询需要读取更少的页,从而提高性能。 理解碎片整理带来的影响和SQL Server预读管理器
碎片对大量读取磁盘边缘的操作带来负面影响。可以使用Windows性能监视器来获取这种影响的衡量。通过性能监视器,可以观测磁盘活动情况,并且有助于决定何时进行碎片整理。
为了理解为什么碎片对DSS型工作具有如此的影响,首先很重要的是要理解碎片是如何影响SQL Server预读管理器的。为了完成需要扫描一个或多个索引的查询,SQL Server预读管理器负责提前对索引页进行扫描,并且将额外的数据页放到SQL Server数据缓存中。根据基础页的物理顺序,预读管理器动态地调整读取量。当碎片较少时,预读管理器即时可以读取较大的数据块,更高效地利用I/O子系统。当数据产生碎片时,预读管理器只能读取较小的数据块。预读的数量虽然和数据的物理顺序无关,不过,因为较小的读取请求消耗更多的CPU/时钟,所以最终就会降低整个磁盘的吞吐量。
在所有情况下,预读管理器能提高性能;但是,当存在碎片,且预读管理器无法读取较大的数据块,整个磁盘的吞吐量就下降。通过检查性能监视器中的Physical Disk相关的计数器可以发现该现象。下表列举并描述了这些计数器。
表4 性能监视器中物理磁盘计数器
Physical Disk counterDescriptionAvg Disk sec/ Read该计数器用于衡量磁盘延迟。测试显示当碎片出于很高水平(大于等于30%)时,会增加磁盘延迟。Disk Read Bytes/ sec该计数器能很好地衡量全面的磁盘吞吐量。一段时间内工作量的下降趋势可以用来表示碎片正在影响性能。Avg Disk Bytes/ Read该计数器用于衡量每个读取请求带来的数据读取量。当索引页连续,SQL Server预读管理器可以一次读取较大的数据块,对I/O子系统的利用效率较高。测试显示该计数器值和碎片数量间有着直接联系。当碎片级别上升,该值就下降,从而影响全面的磁盘吞吐量。Avg Disk Read Queue Length一般而言,该计数器为每两个物理磁盘上持续的平均数值。测试中,很可能由于较高的延迟和较低的全面磁盘吞吐量,使得该计数器随着碎片的增加而增加。 图4到图7显示在DSS型工作中,性能监视器报告的磁盘吞吐量和平均读取大小。 http://www.v2studio.cn/blog/gaojier/%22http://storage.msn.com/x1pKouN4nZmbX1GXt4PK3fT0r--wpY720dGZZbuMFWxNVqk0OHHD6WOKGxHDqeVvUDRYi_jLTM5ZAPkdJswP1-w4Ihli-IOjieAEt2dWn6SliZCFp1OVAtjxB5h2hbT7J19mcTM-XLf1RqOSce-WtOZxA%22
图8: DBCC INDEXDEFRAG的数据文件页移动情况
DBCC INDEXDEFRAG并不会帮助整理分散插入到数据文件中的索引,这种分散插入称为Interleave。同样,DBCC INDEXDEFRAG也不对扩展页碎片进行整理。当索引扩展页(扩展页=8页)中的数据并不连续的时候,出现Interleave,此时多个扩展页的数据在文件中是交叉状态。因为即使逻辑顺序和物理顺序一致情况下,所有的索引页也不见得一定是连续的,因此即使没有逻辑碎片情况下,Interleave也会存在。 虽然上面提到了DBCC INDEXDEFRAG的限制,但是测试显示,DBCC INDEXDEFRAG对性能的改善和DBCC DBREINDEX一样有用。实际上,从测试结果可以看出,即使重建了索引,使得Interleave最小,这部分优化并不会对性能带来显著提升。减少逻辑碎片级别这部分优化才对性能提升最多。这就是为什么检查索引碎片时,建议将重点放在逻辑碎片整理和页密度碎片上的原因。表5总结了DBCC DBREINDEX和DBCC INDEXDEFRAG之间的差别。
表5 DBCC DBREINDEX 和 DBCC INDEXDEFRAG的比较
FunctionalityDBCC DBREINDEXDBCC INDEXDEFRAGOnline/OfflineOfflineOnlineFaster when logical fragmentation is:HighLowParallel processingYesNoCompacts pagesYesYesCan be stopped and restarted without losing work completed to that pointNoYesAble to untangle interleaved indexesMay reduce interleavingNoAdditional free space is required in the data file for defragmentingYesNoFaster on larger indexesYesNoRebuilds statisticsYesNoLog space usageHigh in full recovery mode (logs entire contents of the index), low in bulk logged or simple recovery mode (only logs allocation of space)Varies based on the amount of work performedMay skip pages on busy systemsNoYes 性能: DBCC DBREINDEX vs. DBCC INDEXDEFRAG
测试显示,无论是DBCC DBREINDEX还是DBCC INDEXDEFRAG,都可以有效地整理索引碎片,并将页密度恢复到初始填充因子规定的页密度附近。基于这些结果,下面需要决定什么时候应用哪种整理方式。
如果允许有一段时间进行离线索引重建,DBCC DBREINDEX一般来说比DBCC INDEXDEFRAG要快。DBCC DBREINDEX可以充分利用多处理器系统的平行性能。DBCC INDEXDEFRAG用于对生产环境干扰不大,对工作性能影响不大的场合。测试显示,即使同时几个DBCC INDEXDEFRAG并行工作,对性能下降的影响也从来不会超出10%。但是,这也同样使得DBCC INDEXDEFRAG针对较大的索引整理时,需要很长的时间才能完成。而且,工作时间的长短还依赖于当时在服务器上运行的访问工作。
图9为DBCC INDEXDEFRAG和DBCC DBREINDEX的性能比较。图中的数据为小规模环境下,对所有索引进行整理的时间(大规模环境下结果类似,DBCC INDEXDEFRAGY运行时间为DBCC INDEXREINDEX的8倍)。当碎片级别增加,索引大小增加时,DBCC DBREINDEX可以比DBCC INDEXDEFRAG执行得更快。 http://www.v2studio.cn/blog/gaojier/%22http://storage.msn.com/x1pKouN4nZmbX1GXt4PK3fT0r--wpY720dGZZbuMFWxNVr9jwuRGRYGiGtYaBSKUk38iciN1uTYKeo3ToiDgBWqDUeNf7WStx9AAzNmZH5iwt-k7gqVzH6_RrCqeU0UfHM8T2gJc40qYBmXqzVTlLXMkQ%22
Microsoft Knowledge Base article 243589: "HOW TO: Troubleshoot Slow-Running Queries on SQL Server 7.0 or Later" at http://support.microsoft.com/default.aspx?scid=KB;en-us;243589&sd=tech
Microsoft SQL Server 2000 Performance Tuning Technical Reference, Microsoft Press, ISBN: 0-7356-1270-6
"Windows 2000 IO Performance" from Microsoft Research at http://research.microsoft.com/BARC/Sequential_IO/Win2K_IO.pdf
附录 A : 测试环境
本文的测试使用下面的硬件和软件环境: Microsoft Software
Microsoft Windows 2000 Data Center (Service Pack 3)
Microsoft SQL Server 2000 Enterprise Edition (Service Pack 2) Hardware Platform
Small-Scale Environment:
Dell PowerEdge 6450
4 Intel Pentium III Xeon 550 MHz processors
4 GB RAM
Large-Scale Environment:
Dell PowerEdge 8450
8 Intel Pentium III Xeon 550 MHz processors
16 GB RAM Storage
Small-Scale Environment:
1 Dell PowerVault 660f, with 2, 18 GB 10,000 RPM disks
Total Disk Space = 36 GB (Raid 0)
Large-Scale Environment:
1 Hitachi Freedom Storage Lightning 9960 system, with 192, 73 GB, 10,000RPM disks
Total Disk Space = 13 TB (~6 TB after RAID 1+0 and further striping/slicing) Host bus adapters (HBA)
8 Emulex LP9002L PCI Host Bus Adapters
Firmware 3.82A1
Port Driver v5-2.11a2 Fabric switch
1 McData Switch, 1 GB Storage management software
Hitachi Command Control Interface (CCI)
Hitachi ShadowImage Databases
Representative OLTP and DSS databases