適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 資料庫
資料庫引擎執行個體中的 I/O 包括邏輯和實體寫入。 當資料在緩衝區中的頁面被修改時,即會發生邏輯性寫入。 將分頁從 緩衝快取 寫入磁碟時,即會發生實體寫入。
在緩衝區快取中修改頁面時,它不會立即寫回磁碟;相反地,頁面會標示為骯髒。 這表示在頁面實際寫入磁碟之前,可以進行多次邏輯寫入操作。 每次邏輯寫入時,一筆交易記錄檔記錄會被插入到用於記錄修改的交易記錄檔快取中。 日誌記錄必須在相關的髒頁從緩衝區快取移除並寫入磁碟之前,先行寫入磁碟。
SQL Server 會使用稱為「預寫入日誌」的技術,防止在相關聯的日誌記錄寫入磁碟之前寫入髒頁。 這是復原管理員正確運作的先決條件。 如需詳細資訊,請參閱 預先寫入事務歷史記錄。
SQL Server 如何寫入修改的數據頁面
下圖顯示寫入已修改資料頁的程序。
緩衝管理器在寫入頁面時,會搜尋可以併入單一聚集寫入操作的相鄰髒頁面。 相鄰頁面具有連續的頁面標識符,且來自同一個檔案;頁面不必在記憶體中連續。 搜尋會同時向前、後兩個方向進行,直到下列其中一個事件發生為止:
- 找到一個乾淨的頁面。
- 已經找到 32 個頁面。
- 發現一個髒頁面,其日誌序號(Log Sequence Number, LSN)尚未被刷新到日誌中。
- 找到無法立即鎖定的頁面。
如此一來,可以利用單一累積寫出作業將整組頁面寫入磁碟。
就在寫入頁面之前,資料庫中指定的頁面保護格式會加入至頁面。
如果新增了撕裂的頁面保護,則必須針對I/O 以獨佔方式鎖定頁面(EX)。 這是因為撕頁保護會修改頁面,使得任何其他執行緒都無法讀取。
如果添加校驗碼頁面保護,或資料庫不使用頁面保護,頁面會為I/O加上更新 (UP) 鎖。 此閂鎖會防止其他人在寫入期間修改頁面,但是仍允許讀取器使用它。
如需磁碟 I/O 頁面保護選項的詳細資訊,請參閱 緩衝區管理。
如何將髒頁面寫入磁碟
髒資料頁會透過以下三種方式之一寫入磁碟:
延遲寫入、急切寫入和檢查點程式不會等待I/O作業完成。 這些處理序一律使用非同步 (或重疊) I/O,並繼續執行其他工作,稍後才檢查 I/O 是否成功。 這可讓 SQL Server 為適當的工作提供最多的 CPU 和 I/O 資源。
延遲寫入過程
怠惰寫入器是一個系統處理序,透過從緩衝快取移除不常使用的頁面來保持緩衝區可用。 髒頁面會首先寫入磁碟。
急切寫入程式
急切寫入處理序會寫入與最低記錄等級之操作相關的未提交的數據頁面,例如 bulk insert 和 select into。 此處理序允許建立頁面與寫入新頁面的作業平行進行。 也就是說,呼叫作業不需要等到整個作業完成,再將頁面寫入磁碟。
檢查點程序
檢查點處理序會定期掃描緩衝快取,尋找來自指定資料庫的頁面緩衝區,並將所有髒頁面寫入磁碟。 藉由建立一個點,確保所有髒頁面都已寫入磁碟中,檢查點可在之後的復原過程中節省時間。
使用者可能會使用 CHECKPOINT 命令來要求檢查點作業,或者 Database Engine 可能會根據上次檢查點之後所耗用的記錄空間和時間量產生自動檢查點。 此外,檢查點還會在發生特定活動時產生。 例如,從資料庫加入或移除資料或記錄檔時,或者在停止 SQL Server 的執行個體時。
如需詳細資訊,請參閱 檢查點和記錄的活動部分。