理解SQL查詢的底層原理

2021-09-25 20:02:18 字數 2115 閱讀 7180

閱讀目錄

本系列【t-sql】主要是針對t-sql的總結。

t-sql基礎

【t-sql基礎】01.單錶查詢-幾道sql查詢題

【t-sql基礎】02.聯接查詢

【t-sql基礎】03.子查詢

【t-sql基礎】04.表表示式-上篇

【t-sql基礎】04.表表示式-下篇

【t-sql基礎】05.集合運算

【t-sql基礎】06.透視、逆透視、分組集

【t-sql基礎】07.資料修改

【t-sql基礎】08.事務和併發

【t-sql基礎】09.可程式設計物件

t-sql高階

【t-sql高階】01.

好用的sql tvp~~獨家贈送[增-刪-改-查]的例子

【t-sql高階】02.理解sql查詢的底層原理

t-sql效能調優

【t-sql效能調優】01.tempdb的使用和效能問題

持續更新......歡迎關注我!

回到頂部

包含三大元件:

(1)命令解析器:檢查語法和轉換查詢樹。

(2)查詢執行器:優化查詢。

(3)查詢優化器:負責執行查詢。

包含三大元件:

(1)事務管理器:通過鎖來管理資料及維持事務的acid屬性。

(2)資料訪問方法:處理對行、索引、頁、行版本、空間分配等的i/o請求。

(3)緩衝區管理器:管理sql server的主要記憶體消耗元件buffer pool。

包含sql server的所有快取。如計畫快取和資料快取。

記錄事務的所有更改。保證事務acid屬性的重要元件。

資料庫的物理儲存檔案。

建立在客戶端和伺服器之間的網路連線的協議層

回到頂部

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 查詢底層原理

摘自 悟空聊架構之理解t sql理解底層查詢原理 特此記錄一下 1.當客戶端執行一條t sql語句給sql server伺服器時,會首先到達伺服器的網路介面,網路介面和客戶端之間有協議層。2.客戶端和網路介面之間建立連線。使用稱為 格式資料流 tds 資料報的 microsoft 通訊格式來格式化通...

SQL中 left join 的底層原理

left join的實現效果就是保留左表的全部資訊,將右表往左表上拼接,如果拼不上則為null。除了left join以外,還有inner join outer join right join等,文章不介紹其他連線的具體效果,主要講解join的底層原理是如何實現的?具體效果是怎樣呈現的?只有懂得了底...

Map底層原理解析

map 採用了陣列加鍊表的方式儲存 橫向陣列,縱向鍊錶 當有同一hash值得資料會被房到同意陣列後面形成鍊錶 hashmap 預設16長度 putint hash hash key 獲取hash值 int i indexfor hash,table.length tab hash n 1 返回map...