一個大的SQL語句操作,執行計劃中包含了一個merge操作,觀察到SQL長時間處於IO_COMPLETION等待狀態,如果是讀取相關的表的數據,伺服器應該全力為其服務,但是伺服器的物理IO又遠遠沒有達到瓶頸。這個IO_COMPLETION到底是在做什麼?是表的數據頁IO請求還在其他操作?如果是,跟P ...
一個大的SQL語句操作,執行計劃中包含了一個merge操作,觀察到SQL長時間處於IO_COMPLETION等待狀態,如果是讀取相關的表的數據,伺服器應該全力為其服務,但是伺服器的物理IO又遠遠沒有達到瓶頸。
這個IO_COMPLETION到底是在做什麼?是表的數據頁IO請求還在其他操作?如果是,跟PAGEIOLATCH_*是什麼區別?如果不是,又是什麼類型的操作?
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/