SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

一个大的SQL语句操做,执行计划中包含了一个merge join操做,观察到SQL长时间处于IO_COMPLETION等待状态,若是是读取相关的表的数据,服务器应该全力为其服务,可是服务器的物理IO又远远没有达到瓶颈。
这个IO_COMPLETION究竟是在作什么?是表的数据页IO请求还在其余操做?若是是,跟PAGEIOLATCH_*是什么区别?若是不是,又是什么类型的操做?sql

IO_COMPLETION 这种等待类型表示数据文件中的各类同步读和写操做,这些操做与表无关,而且从事务日志中读取。
在等待I/O操做完成时发生。这种等待类型一般表示非数据页I/O。数据页I/O完成等待做为PAGEIOLATCH_*等待出现。
IO_COMPLETION与PAGEIOLATCH_*的最大的区别是就在于IO_COMPLETION是非数据页的等待,而PAGEIOLATCH_*是数据页的IO等待
IO_COMPLETION这种等待类型表示数据文件中的各类同步读和写操做,这些操做与表无关,而且从事务日志中读取。缓存

包括如下几种场景:
1.从事务日志中读取日志块(在致使从磁盘读取日志的任何操做期间——例如恢复)
2.在不少操做中,例如恢复、DB启动、恢复期间从磁盘读取分配位图(例如GAM、SGAM、PFS页)
3.将中间排序缓冲区写入磁盘(称为“Bobs”)
4.在merge join期间,向磁盘写入或者读取磁盘中的merge join的结果
5.读写eager spools(数据缓存到磁盘的一种行为)到磁盘
6.从事务日志中读取VLF头信息。服务器

 

参考:https://www.sqlskills.com/help/waits/io_completion/日志

相关文章
相关标签/搜索