在前面兩篇文章中( 淺談SQL Server內部運行機制 and 淺談SQL Server數據內部表現形式 ),我們交流了一些關於SQL Server的一些術語,SQL Sever引擎 與SSMS抽象模型,SQL Server內部存儲機制和SQL Server內部體繫結構等。討論的這些問題,均可以歸 ...
在前面兩篇文章中( 淺談SQL Server內部運行機制 and 淺談SQL Server數據內部表現形式 ),我們交流了一些關於SQL Server的一些術語,SQL Sever引擎
與SSMS抽象模型,SQL Server內部存儲機制和SQL Server內部體繫結構等。討論的這些問題,均可以歸為一個問題,即"SQL Server是怎麼執行客戶端輸入的SQL
語句的?”,其中,重點討論了下圖(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。
(一)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將這項工作(這個請求)分成一個或多個任務,每個任務由一個線程負責,任務被放在任務隊列中,等待調度器去調度工作線程來執行,
原則上,調度器會為每個任務分配一個工作線程,這個工作線程就負責執行該任務。每個線程都有三個狀態,即執行狀態(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狀態)
(三)Windows OS與SQL Server
當一臺電腦剛生產出來,未裝任何系統時,我們稱之為裸機,對於裸機,我們是無法使用的,若要使用,則需要安裝操作系統,如win10,
當我們在裸機上裝上操作系統後,就可以通過操作系統來操作電腦了,如查看cpu,管理文件,管理記憶體等,不僅僅如此,我們還在操作系統上
安裝相應的運用軟體,如Visual Studio 2017,SQL SERVER 2014等。
二 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_*: 該類型包含資料庫相關信息
三 參考文獻
【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]。
- 可以轉載該博客,但必須著名博客來源。