原文:
SQL Server中與IO相關的等待類型:IO_COMPLETION和PAGEIOLATCH_*一個大的SQL語句操作,執行計劃中包含了一個merge join操作,觀察到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/