天天看點

SQL Server中與IO相關的等待類型:IO_COMPLETION和PAGEIOLATCH_*

原文:

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/