天天看點

解析SQL Server之任務排程

        在前面兩篇文章中( 淺談SQL Server内部運作機制 and 淺談SQL Server資料内部表現形式 ),我們交流了一些關于SQL Server的一些術語,SQL Sever引擎

與SSMS抽象模型,SQL Server内部存儲機制和SQL Server内部體系結構等。讨論的這些問題,均可以歸為一個問題,即"SQL Server是怎麼執行用戶端輸入的SQL

語句的?”,其中,重點讨論了下圖(SQL Server 體系結構)

解析SQL Server之任務排程

       然而,如果我們僅僅了解如上技術,是不具備一個資深DBA或資料庫優化高手條件的,原因很簡單,我們僅僅知道了SQL Server是怎麼做的(SQL Server是如

何執行SQL語句的),但是我們并不知到是什麼做的(是什麼真正執行SQL語句?),隻知其然,而不知其是以然。本篇文章,我們将重點論述是什麼執行了SQL Server

體系結構邏輯?其實,執行SQL Server體系結構邏輯的核心元件便是SQLOS(簡稱SQL Server作業系統)。

 一  SQL Server引擎元件

       下圖為SQL Server引擎核心主件,它大緻包括五大部分:協定層(Protocol Layer),查詢引擎(Query Processor),存儲引擎(Storage Engine),公用元件(Utilities)和

SQL Server作業系統(SQLOS)。其中,除了Utilities和SQLOS兩大部分外,其他部分在前面兩篇文章中均已簡要論述。本篇文章,我們将重點論述SQLOS。

解析SQL Server之任務排程

         (一)SQLOS

         SQLOS是SQL Server和Windows OS(Windows  作業系統)瘦使用者模式層,它主要負責一些底層的操作,如排程、處理I/O、記憶體管理、檔案管理等。

        當用戶端(如在SSMS中輸入)輸入一條SQL語句(SELECT * FROM TableName),并基于TDS服務點,向SQL Server服務引擎送出該語句,SQL Sever引擎接收到

該語句後(準确來說,是先通過Protocol Layer協定層),查詢引擎的指令分析器(Query Processor)先檢查文法結構,若文法結構有錯誤,則直接将錯誤傳回給用戶端,

編譯不通過;若文法正确,則指令分析器會去緩沖池的計劃任務中尋找是否存在該語句的緩存,若存在,則指令分析器把該計劃緩存交給查詢執行器處理,若緩存池的計

劃緩存中沒有該計劃任務,則指令解析器将會生成查詢樹,并将該SQL語句傳遞給查詢優化器,查詢優化器根據“最少開銷算法”生成最優方案,然後傳遞給查詢執行器;

流程到查詢執行器後,查詢執行器通過存儲引擎的通路方法傳遞給存儲引擎,存儲引擎根據規則來配置和使用緩沖區管理器和事務管理器,接下來的工作,就交給

SQLOS來處理。

        也許讀者會問?為什麼不直接用Windos OS來排程,而要另做一個SQLOS來執行排程呢?因為Windows OS是基于“搶占式排程算法的”,這種算法依據時間片來執行的,

這種算法并沒有針對SQL Server進行優化,為了解決這個問題,微軟決定SQL Server應自己處理自己的排程,并通過建立使用者模式排程器(UMS)來解決該問題,UMS基于

“合作排程模式”算法被設計,這種算法指當執行中的線程需要等待其他資源才能執行時,不會因為時間片的輪詢被中斷,而是采用自動退出處理器的方式。

解析SQL Server之任務排程

     (二)線程三态

       當在一個會話中執行請求時,SQL Server将這項工作(這個請求)分成一個或多個任務,每個任務由一個線程負責,任務被放在任務隊列中,等待排程器去排程工作線程來執行,

原則上,排程器會為每個任務配置設定一個工作線程,這個工作線程就負責執行該任務。每個線程都有三個狀态,即執行狀态(Running)、挂起狀态(Suspend)和可執行狀态(Runable)。

  • 執行狀态(Running):表示該線程正在執行任務       
  • 挂起狀态(Suspend):表示該線程因缺資源,被CPU強制挂起,如嘗試修改被鎖的表
  • 可執行狀态(Runnable):表示線程具備了可執行任務的條件,如線程1執行完任務1後,被放線上程隊列中,等待排程器配置設定任務

     線程三個狀态之間,存在如下轉換關系:

      1.具備執行條件的線程(Runnable),隻要獲得CPU,就可執行任務,進而從Runnable狀态變成Running狀态

      2.正在執行的線程(Running)因缺必要資源,被cpu挂起,進而從Running狀态變成Suspend狀态

      3.被挂起的線程(Suspend)因獲得可執行的資源,被cpu喚醒執行,進而從Suspend狀态變成Running狀态

      4.Runnable狀态的線程,排程器可不讓其執行(這裡,暫且稱之為Suspeng狀态)

解析SQL Server之任務排程

      (三)Windows OS與SQL Server

       當一台電腦剛生産出來,未裝任何系統時,我們稱之為裸機,對于裸機,我們是無法使用的,若要使用,則需要安裝作業系統,如win10,

當我們在裸機上裝上作業系統後,就可以通過作業系統來操作電腦了,如檢視cpu,管理檔案,管理記憶體等,不僅僅如此,我們還在作業系統上

安裝相應的運用軟體,如Visual Studio 2017,SQL SERVER 2014等。

解析SQL Server之任務排程

二  SQL Server一個較為完整的排程流程

     當SSMS向SQL Server引擎發起請求時,将會産生一個會話(Session),會話成功後,就可以執行SQL語句請求了。

     1.當建立會話成功後,在會話中建立一個SQL語句請求時(如執行查詢語句:SELECT * FROM TableName),會話會将一個請求分成一個或多個任務,并将這些任務放在任務隊列中;

     2.每個任務都會被配置設定一個或多個工作線程來執行;

     3.SQLOS任務排程器通過從工作線程隊列中排程線程來執行相應的工作任務

     注意:SQLOS隻是邏輯的,真的的執行還是Windows OS

     以下是一些涉及到的相關類型表

      sys.dm_exec_*:該類型表包含使用者代碼執行和關聯連接配接直接或間接相關的資訊,如請求表sys.dm_exec_requests,會話表sys.dm_exec_sessions

      sys.dm_os_*:    該類型表包含操作OS相關的資訊

      sys.dm_tran_*:  該類型表包含事務相關資訊

      sys.dm_logpool_*:該類型包含日志相關資訊

      sys.dm_io_*:      該類型表包含IO相關資訊

      sys.dm_db_*:    該類型包含資料庫相關資訊

解析SQL Server之任務排程

三  參考文獻

 【01】《Microsoft SQL Server 2012 Internals》Kalen Delaney,Bob Beauchemin,Conor Cunningham,Jonathan Kehayias,Benjamin Nevarez,Paul S.Randal

 【02】《Microsoft SQL Server 2012 Administration》Tom Carpenter

 【03】《SQL Server 2012 深入解析與性能優化 第3版》Christian Bolton,Justin Langford,Glenn Berry,Gavin Payne,Amit Banerjee,Rob Farley著

 【04】《Microsoft SQL Server 2008 技術内幕:T-SQL查詢》ltzik Ben-Gran,Lubor Kollar,Dejan Sarka,Steve Kass著

 【05】《SQL Server 2008查詢性能優化》Grant Fritchey,Sajal Dam著

四  版權區

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 部落客網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複制和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該部落格,但必須著名部落格來源。

繼續閱讀