Sql-Server

PAGEIOLATCH_* 和 IO_COMPLETION 有什麼區別?

  • April 7, 2020

根據這個部落格:

SQL Server 聯機叢書將IO_COMPLETION定義為“在等待 I/O 操作完成時發生。*這種等待類型通常代表非數據頁 I/O數據頁 I/O完成等待顯示為**PAGEIOLATCH_**等待”

非數據頁 IO 是什麼意思?或者我們可以換一種方式提出這個問題:“……等待 I/O 操作完成”實際上是什麼

意思?

PAGEIOLATCH_*

我引用Paul Randal 的部落格文章

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 標頭

引用自:https://dba.stackexchange.com/questions/264455