眾所周知,SQLServer增刪改資料最先都是在記憶體中進行的,這可以大大加快資料操作的速度;當記憶體中的資料被修改了,而磁碟中的資料
還沒有被修改時,就產生了所謂的”髒頁“,SQLServer是如何同步記憶體和磁碟的資料的呢?以下三種方法就是為同步記憶體和磁碟資料而產生的。
LazyWrite(惰性寫入器):
作用:
1.管理SQLServer空閑記憶體:
a. 定期檢查空閑緩衝列表的大小,當這個值過低的時候,它會掃描整個資料緩衝,將一段時間沒有使用的頁面老化(通過LRU演算法),釋放記憶體空間;
b. 如果找到一段時間沒有被使用的髒頁,它會將其寫入磁碟,然後將這個頁面的記憶體空間標記為空白閑空間;
2.協調Windows與SQLServer記憶體:
a. 監視伺服器記憶體,如果Windows實體記憶體很少,它會從空閑緩衝列表中釋放記憶體給Windows;
b. 在SQLServer負載很重時,它還會在分配給SQLServer的記憶體沒有達到最大伺服器記憶體閥值時,增加空閑緩衝列表的大小,以適應負載的需要。
CheckPoint:
作用:檢查點是檢查點進程建立的一個時間點,在這個時間點,SQLServer可以確認所有提交的事物所做的修改都已經寫入磁碟,它是一個標記,
這個標記是資料庫恢複的起始點,大約每分鐘運行一次,這樣在啟動資料庫時,確保資料庫在一分鐘內就能完成恢複操作;但是如果在這段
時間內寫入日誌的資料不到10MB,SQLServer就不會自動發起檢查點。
跟蹤標記(trace flag)3502在錯誤記錄檔中記錄檢查點的開始和結束位置。
與LazyWrite比較,CheckPoint不會從緩衝中移出髒頁,CheckPoint進程的工作只是保證髒頁被寫入磁碟,並且在頁頭將緩衝中的這個頁面標記為
乾淨的頁面。
EagerWrite:
通常在BCP、SELECT INTO, WRITETEXT,UPDATETEXT,BULK INSERT等操作時發生,為了加快這些操作的速度,EagerWrite會管理資料頁
的建立和分配,這些操作不會等待所有的頁面建立完成後才將記憶體中的資料寫入到頁面中,而是以更高的優先順序邊建立邊將緩衝中的資料寫入頁面中,
以保證緩衝池有足夠的空間來完成這些操作。