眾所周知,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會管理數據頁
的創建和分配,這些操作不會等待所有的頁面創建完成后才將內存中的數據寫入到頁面中,而是以更高的優先級邊創建邊將緩存中的數據寫入頁面中,
以保證緩沖池有足夠的空間來完成這些操作。