SQL Server優化必備之任務調度

来源:https://www.cnblogs.com/wangjiming/archive/2018/12/26/10175380.html
-Advertisement-
Play Games

在前面兩篇文章中( 淺談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]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 命令:當前伺服器執行 scp -r /usr/local/test root@目標伺服器公網ip:/home/app/PicAnalyser/ ps:加上-r參數直接拷貝整個文件夾(速度相當快) 可以先把要傳輸的數據打包,然後整個文件夾傳輸過去,切記打包前要刪除日誌文件,儘量減少不必要的文件 圖中命 ...
  • 一 docker網路模式 Docker使用Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網路等。 一個Network Namespace提供了一份獨立的網路環境,包括網卡、路 ...
  • 這篇博客幫助挺大,我補充部分,幫助同樣的小白哈哈,侵刪 https://www.cnblogs.com/lynn li/p/5885001.html 1、前期準備 需要安裝:JDK,SDK,python 1)JDK: 下載鏈接:https://www.oracle.com/technetwork/j ...
  • 1、下載安裝stc-isp燒錄軟體: 官網:http://www.gxwmcu.com/ 2、打開使用stc-isp軟體,並導入stc官方器件庫: 註意:一定要找到包含有C51和UV4的文件夾 3、顯示添加成功後,打開【Project】——【Select Device for Target...】即 ...
  • 另請參見:Navicat Premium 12.0.18 / 12.0.24安裝與激活 另請參見:Navicat Premium 12安裝與激活(親測已成功激活) 說明: 本主親自驗證過,可以激活! Navicat Premium 12 的安裝我就不說了(預設已經安裝好了),只說怎麼激活。 Navi ...
  • 摘要: 下文講述通過一條sql語句,採用over關鍵字同時對不同類型進行分組的方法,如下所示: 實驗環境:sql server 2008 R2 當有一張明細表,我們需同時按照不同的規則,計算平均、計數、求和等聚合計算時,此時我們可以使用over子句對數據進行操作。例: 我們需獲取一個學生成績的 總平 ...
  • 最近在複習資料庫相關知識點,過幾天就要考試了; 第一章 資料庫基礎知識 1、資料庫管理是數據處理的基礎工作,資料庫是數據管理的技術和手段。資料庫中的數據具有整體性和共用性。 1.2、資料庫系統的核心:資料庫管理系統。 1.3、資料庫核心:數據模型; 2、資料庫(DB)是一個按數據結構來存儲和管理數據 ...
  • 穿透: 從緩存中查詢一個數據,查到為空,需要每次都去資料庫中查詢。而從資料庫中查詢出來也為空,也就不寫入緩存。導致一個不存在的數每次都去資料庫中查詢,造成db系統很大壓力 造成緩存穿透 解決:如果從資料庫中查詢結果為空,我們也要緩存起來,避免下次訪問緩存中沒有,而去訪問資料庫 雪崩:緩存在一段是時間 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...