挂起的I/O请求可以在下面查询中查到,并且用于识别那个磁盘负责的这个瓶颈:


select database_id,
       file_id,
       io_stall,
       io_pending_ms_ticks,
       scheduler_address
from sys.dm_io_virtual_file_stats(NULL, NULL) iovfs,
       sys.dm_io_pending_io_requests as iopior
where iovfs.file_handle = iopior.io_handle


  磁盘碎片(Disk Fragmentation):

  建议你检查磁盘碎片和配置用于SQLServer实例的磁盘。在NTFS文件系统中的碎片会产生严重的性能影响。磁盘需要经常整理碎片并且指定整理碎片计划。研究表明,一些情况下SAN在整理碎片后性能更差。因此,SAN必须根据实际情况对待。

  NTFS上的索引碎片同样能引起高I/O好用。但是这和在SANs中的效果是不一样的。

  磁盘配置/佳实践:

  常规情况,你应该把日志文件和数据文件分开存放以获得更好的性能。对于重负载的数据文件(包括tempdb)的I/O特性是随机读取。对于日志文件,是顺序访问的,除非事务需要回滚。

  对于内置磁盘仅仅可以用于数据库日志文件,因为它们对顺序I/O有很好的性能,但是对随机I/O性能低下。

  数据库的数据和日志文件应该放在对应专用的磁盘中。确保良好的性能。建议日志文件放在两个内置磁盘,并配置为RAID 1。数据文件驻留在仅用于给SQLServer访问的SAN系统中,并只被查询和报表控制。特殊访问应该被禁止。

  写缓冲在可能的情况下应该被允许,并保证断电也能使用。

  为了尽可能保证对于OLTP系统的I/O瓶颈影响小化,不应该把OLAP和OLTP环境混合。并且保证你的代码优化及有合适的索引来避免不必要的I/O。