Sql-Server
PAGEIOLATCH_* 和 IO_COMPLETION 有什麼區別?
根據這個部落格:
SQL Server 聯機叢書將IO_COMPLETION定義為“在等待 I/O 操作完成時發生。*這種等待類型通常代表非數據頁 I/O。數據頁 I/O完成等待顯示為**PAGEIOLATCH_**等待”
非數據頁 IO 是什麼意思?或者我們可以換一種方式提出這個問題:“……等待 I/O 操作完成”實際上是什麼
意思?
PAGEIOLATCH_*
SQL Server 有兩種類型的讀取:邏輯 I/O 和物理 I/O。當儲存引擎的訪問方法部分需要訪問一個頁面時,它會向緩衝池請求指向記憶體中頁面的指針(稱為邏輯 I/O),緩衝池會檢查其元數據以查看該頁面是否存在已經在記憶中了。
如果頁面在記憶體中,緩衝池會為訪問方法提供指針,並且 I/O 仍然是邏輯 I/O。如果頁面不在記憶體中,緩衝池會發出一個“真正的”I/O(稱為物理 I/O),執行緒必須等待它完成——導致 PAGEIOLATCH_XX 等待。一旦 I/O 完成並且指針可用,就會通知執行緒並且可以繼續執行。
IO_COMPLETION
再次引用屬於 sqlskills.com 的網頁。
這種等待類型代表了數據文件中的各種同步讀寫操作,與表無關,加上從事務日誌中讀取。
非數據頁 IO 是什麼意思?
Paul Randal 文章中的幾個例子可以清楚地說明
nod-data
頁面的含義。
- 從事務日誌中讀取日誌塊(在導致從磁碟讀取日誌的任何操作期間 - 例如恢復)
- 在許多操作(例如恢復、數據庫啟動、恢復)期間從磁碟(例如 GAM、SGAM、PFS 頁)讀取分配點陣圖
- 將中間排序緩衝區寫入磁碟(這些稱為“Bobs”)
- 在合併連接期間從磁碟讀取和寫入合併結果
- 讀取和寫入急切的線軸到磁碟
- 從事務日誌中讀取 VLF 標頭