MSSQL數據庫後臺進程(線程)

與Oracle數據庫相似,微軟數據庫產品MSSQL也有諸多後臺進程來保證數據庫系統的高效正常運轉,因爲MSSQL採用的是線程模型,應該叫作後臺線程,爲了你們易於理解,咱們在暫且稱之爲後臺進程,下面咱們就來簡要看一下:數據庫

一、 數據寫相關進程windows

1)   Lazy writer:該進程用來確保系統緩衝區(buffer pool)中有足夠的自由內存,該進程按期掃描緩衝內存頁,以發現不常使用的內存頁並將其移出緩衝區,期間,會先將髒頁數據寫出到磁盤並移除緩衝區。session

2)   Eager writer:和lazy writer相似,該進程也是負責將緩衝區內的髒頁寫出到磁盤,但它寫出的這些內存頁主要是和非日誌(non-logged,例如:bulk insert,select into)操做相關,期間,容許讀寫新頁並行發生。異步

3)   Checkpoint:該進程按期掃描緩衝區以發現特定數據庫的髒頁,並將這些髒頁寫出到磁盤,經過建立一個在此以前確認全部髒頁都寫出到磁盤的時間點,能夠減小最近數據庫恢復須要的時間。用戶能夠經過提交checkpoint命令來請求一個檢查點操做,或者系統也能夠根據消耗的日誌空間或時間自動產生一個檢查點操做,此外,當系統中的某些事件也會致使檢查點的發生,例如:增減或移除數據文件或日誌文件,實例的關閉等。當檢查點發生時,該進程將緩衝區內的髒頁寫出到磁盤,不管相關事務是否已經提交,都要寫出到磁盤。spa

值得一提的是,這三個後臺進程都是異步的,即它們在進行IO操做的同時能夠去作其餘工做,稍後再來檢查以前IO的完成狀況。線程

二、 事務日誌相關進程代理

1)   Log writer:該進程負責將事務日誌從緩衝區刷出到磁盤日誌文件。MSSQL2016前的版本,每一個實例只有一個log writer進程,所以,該進程負責實例中的全部數據庫log buffer。該進程經過異步IO完成log buffer到磁盤的寫出,當用戶提交一個事務時,該進程阻塞該用戶會話,直到將相關數據庫log buffer數據刷出到磁盤完成,同時,該進程還能夠繼續其餘數據庫log buffer的工做。MSSQL系統中的諸多事件都會觸發log writer進程向磁盤寫出log buffer中的內容,例如:會話提交當前事務,log buffer被寫滿,checkpoint等。日誌

此外,該進程將lredo記錄從log cache/buffer寫出到磁盤log files時,寫出單位是能夠變化的,從512~64k不等,這點來講,不像data buffer寫出進程同樣,最小必須是數據頁大小。索引

2)   Backup log:該進程雖然嚴格來講算不上一個後臺進程,由於它用於完成用戶發出的「backup log…」命令,但它倒是和事務日誌緊密相關。進程

三、 系統監視和管理相關進程

1)   Signal handler:該進程主要負責MSSQL實例的啓動和關閉。

2)   Task manager:該進程也會參與MSSQL實例的啓動過程,主要用來啓動實例相關的全部數據庫。此外,該進程還負責啓動MSSQL內部某些任務,以及監視實例服務進程和啓動時間等任務。

3)   Resource monitor:該進程主要負責監視內存層面的使用和狀態,並在必要時對MSSQL相關緩衝進行調整,當檢測到沒有用戶需求被處理時,將自動進入空閒狀態。

4)   Lock monitor:該進程負責監視阻塞時間超過系統相關閾值的場景,同時,還負責解決死鎖問題。

5)   Ghost cleanup:該進程會週期性的喚醒,並對全部索引中已被標記爲刪除的索引項進行檢查,而後,將這些索引項物理移除。

6)   Trace queue task:該進程負責監視跟蹤文件和行集供應者。對跟蹤文件,該進程每4秒就會將數據刷出到磁盤文件;對行集,將會關閉超過10分鐘沒收到任何事件的供應者。

四、 做業調度相關進程

SQLServer Agent:嚴格來講,這並不算是一個後臺進程,而是windows服務,該服務負責完成各類做業的調度和執行。

五、 其餘相關進程

1)   XE Timer和XE Dispatcher:這些是擴展事件(Extended Event)相關的進程,負責按期將收集到的數據從緩衝異步發送到目的地。

2)   BRKR EVENT HNDLR和BRKR TASK:這些事件是服務代理人(Service Broker)相關進程。前者主要負責處理服務代理的全部啓動和關閉事件;後者爲執行內部服務代理任務的衆多進程之一。

咱們能夠經過以下SQL來查詢MSSQL實例後臺進程相關的信息:

select t.os_thread_id,r.session_id,r.status,r.commandfrom sys.dm_os_threads t inner join sys.dm_os_workers w on t.thread_address=w.thread_addressinner join sys.dm_exec_requests r on w.task_address=r.task_addresswhere r.status like '%background%';

相關文章
相關標籤/搜索