一個大的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頭信息。服務器