【T-SQL進階】02.理解SQL查詢的底層原理
本系列【T-SQL】主要是針對T-SQL的總結。
一、SQL Server組成部分
1.關係引擎:主要作用是優化和執行查詢。
包含三大元件:
(1)命令解析器:檢查語法和轉換查詢樹。
(2)查詢優化器:優化查詢。
(3)查詢執行器:負責執行查詢。
2.儲存引擎:管理所有資料及涉及的IO
包含三大元件:
(1)事務管理器:通過鎖來管理資料及維持事務的ACID屬性。
(2)資料訪問方法:處理對行、索引、頁、行版本、空間分配等的I/O請求。
(3)緩衝區管理器:管理SQL Server的主要記憶體消耗元件Buffer Pool。
3.Buffer Pool
包含SQL Server的所有快取。如計劃快取和資料快取。
4.事務日誌
記錄事務的所有更改。保證事務ACID屬性的重要元件。
5.資料檔案
資料庫的物理儲存檔案。
6.SQL Server網路介面
建立在客戶端和伺服器之間的網路連線的協議層
二、查詢的底層原理
1.當客戶端執行一條T-SQL語句給SQL Server伺服器時,會首先到達伺服器的網路介面,網路介面和客戶端之間有協議層。
2.客戶端和網路介面之間建立連線。使用稱為“表格格式資料流”(TDS) 資料包的 Microsoft 通訊格式來格式化通訊資料。
3.客戶端傳送TDS包給協議層。協議層接收到TDS包後,解壓並分析包裡面包含了什麼請求。
4.命令解析器解析T-SQL語句。命令解析器會做下面幾件事情:
(1)檢查語法。發現有語法錯誤就返回給客戶端。下面的步驟不執行。
(2)檢查緩衝池(Buffer Pool)中是否存在一個對應該T-SQL語句的執行計劃快取。
(3)如果找到已快取的執行計劃,就從執行計劃快取中直接讀取,並傳輸給查詢執行器執行。
(4)如果未找到執行計劃快取,則在查詢執行器中進行優化併產生執行計劃,存放到Buffer Pool中。
5.查詢優化器優化SQL語句
當Buffer Pool中沒有該SQL語句的執行計劃時,就需要將SQL傳到查詢優化器,通過一定的演算法,分析SQL語句,產生一個或多個候選執行計劃。選出開銷最小的計劃作為最終執行計劃。然後將執行計劃傳給查詢執行器。
6.查詢執行器執行查詢
查詢執行器把執行計劃通過OLE DB介面傳給儲存引擎的資料訪問方法。
7.資料訪問方法生成執行程式碼
資料訪問方法將執行計劃生成SQL Server可操作資料的程式碼,不會實際執行這些程式碼,傳送給緩衝區管理器來執行。
8.緩衝區管理器讀取資料。
先在緩衝池的資料快取中檢查是否存在這些資料,如果存在,就把結果返回給儲存引擎的資料訪問方法;如果不存在,則從磁碟(資料檔案)中讀出資料並放入資料快取中,然後將讀出的資料返回給儲存引擎的資料訪問方法。
9.對於讀取資料,將會申請共享鎖,事務管理器分配共享鎖給讀操作。
10.儲存引擎的資料訪問方法將查詢到的結果返回關係引擎的查詢執行器。
11.查詢執行器將結果返回給協議層。
12.協議層將資料封裝成TDS包,然後協議層將TDS包傳給客戶端。
參考資料:
《SQL Server 效能優化與管理的藝術》
作 者:
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
相關推薦
【T-SQL進階】02.理解SQL查詢的底層原理
本系列【T-SQL】主要是針對T-SQL的總結。 一、SQL Server組成部分 1.關係引擎:主要作用是優化和執行查詢。 包含三大元件: (1)命令解析器:檢查語法和轉換查詢樹。 (2)查詢優化器:優化查詢。 (3)查詢執行器:負責執行查詢。 2.儲存引擎:管理所有資料及涉及的IO
【JavaScript進階】深入理解JavaScript中ES6的Promise的作用並實現一個自己的Promise
1.Promise的基本使用 1 // 需求分析: 封裝一個方法用於讀取檔案路徑,返回檔案內容 2 3 const fs = require('fs'); 4 const path = require('path'); 5 6 7 /** 8 * 把一個回
【SQL進階】03.執行計劃之旅1
聽到大牛們說執行計劃,總是很惶恐,是對知識的缺乏的惶恐,所以必須得學習執行計劃,以減少對這一塊知識的惶恐,下面是對執行計劃的第一講-理解執行計劃。 本系列【T-SQL】主要是針對T-SQL的總結。 一、為什麼需要執行計劃? (1)幫助分析 當我們想要去分析SQL語句存在很慢時,需要有一個
【SSH高速進階】——Hibernate 多對多映射
pen prop package 轉載 map tex test lec set 說到多對多關系。印象最深刻的就是大學的選修課。一個學生能夠選修多門課程,一門課程能夠有多個學生選修,學生所選的每一門課程還有成績。這個場景的E-R圖例如以下:
01月05日 三周四次【Python基礎進階】
是個 快速 files 函數 true 結果 lis pre 序列 1.8 遞歸列出目錄裏的文件1.9 匿名函數 1.8 遞歸列出目錄裏的文件 #### 遍歷目錄裏的文件(不支持子目錄文件) import os for i in os.listdir(‘C:/Users
01月11日 四周四次【Python基礎進階】
顯示 進階 col super 自定義 方法總結 總結 類方法 3.1 3.1/3.2 類的繼承3.3 類的屬性總結3.4 類的方法總結 3.1/3.2 類的繼承 類的繼承 繼承是面向對象的重要特點之一 繼承關系: 繼承是相對兩個類而言的父子關系,子類繼承父類所有的公有
01月12日 四周五次【Python基礎進階】
python3.5 rc腳本(類的定義與腳本的結構)3.6 rc腳本(start方法)3.7 rc腳本(stop和status方法)3.8 rc腳本(以daemon方式啟動) 3.5 rc腳本(類的定義與腳本的結構)/3.6 rc腳本(start方法)/3.7 rc腳本(stop和status方法) imp
【菜鳥進階】連結串列_C 結構體 共用體 列舉_遞推遞迴
座右銘 這些年我一直提醒自己一件事情,千萬不要自己感動自己。大部分人看似的努力,不過是愚蠢導致的。什麼熬夜看書到天亮,連續幾天只睡幾小時,多久沒放假了,如果這些東西也值得誇耀,那麼富士康流水線上任何一個人都比你努力多了。人難免天生有自憐的情緒,唯有時刻保持清醒,才能看清
【SSH快速進階】——struts2呼叫action的三種方式
經過前段時間對struts2的學習與實踐,總結了一下在struts2中呼叫action的三種方式。 1、直接呼叫 我前面的部落格【SSH快速進階】系列第一篇《【SSH快速進階】——strut
【SSH快速進階】——Hibernate一對一對映(one-to-one)——主鍵關聯對映
現實生活中,有很多場景需要用到一對一對映,比如每個學生只有一個學生證,每個公民只有一張身份證等。這裡用公民-身份證來舉例說明。 在Hibernate中實現一對一對映,有兩種實現方式:1
【SSH快速進階】——struts2的模型驅動—ModelDriven
上篇部落格《SSH快速進階——struts2簡單的例項》中,處理使用者登陸的action—LoginAction為: package com.danny.user.action; public cl
【SSH快速進階】——探索Hibernate物件的三種狀態:Transient、Persistent、Detached
學習過作業系統的朋友,腦子裡肯定都會有這張程序的狀態轉換圖: 當所有條件就緒,程序被排程執行,時間片到的時候,程序被掛起,進入就緒狀態……對程序進行的不同操作會導致程序進入到不同的狀
【Go unsafe進階】執行空介面中的函式:除了斷言與反射,你還有更好的選擇
開發十年,就只剩下這套架構體系了! >>>
【Java進階】執行緒池深入理解
Java併發程式設計:執行緒池的使用在前面的文章中,我們使用執行緒的時候就去建立一個執行緒,這樣實現起來非常簡便,但是就會有一個問題:如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。那
技術鄰學院 直播預告|【進階】simufact軟件焊接仿真工藝培訓
技術分享 教學 過程 高級工程師 力學 案例 評論 代理 電子 技術鄰學院 直播預告 【進階】simufact軟件焊接仿真工藝培訓 (6月10日) 直播信息 日期: 2017年6月10日(星期六)20:00--21:30 直播地址: 熊貓直播http://pan
【Android進階】(3)Android圖像處理
progress chang etc geo xtend static ogr arch 取出 1. 概念 色調/色相:物體傳遞的顏色 飽和度:顏色的純度,從0(灰)到100%(飽和)來進行描寫敘述 亮度/明度:顏色的相對明暗程度 2. 調整圖像小Demo 創建一個
【Android進階】Junit單元測試環境搭建以及簡單有用
rar theme 選擇 http 技術分享 才幹 ack package family 單元測試的目的 首先。Junit單元測試要實現的功能,就是用來測試寫好的方法是否可以正確的運行,一般多用於對業務方法的測試。 單元測試的環境配置 1.在Andro
【Android 進階】圖片載入框架之Glide
生活 cannot 簡單介紹 style codes 詳細 npr 濾鏡 ive 簡單介紹 在泰國舉行的谷歌開發人員論壇上,谷歌為我們介紹了一個名叫 Glid
【mongoDB查詢進階】聚合管道(三)--表達式操作符
ips www. name tostring 作用 數組操作 操作符 data seconds https://segmentfault.com/a/1190000010910985 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Operators)
【MySQL進階】Keepalived1.4.0結合MySQL 5.7.19實現主備高可用
port 腳本 amp ado roo ins log openss net 1、基本環境 數據庫安裝及主備同步接上一篇文章:http://blog.51cto.com/13946719/2309514JDK 1.8_171MySQL 5.7.19CentOS 7.4Kee