SQL 全稱是 Structured Query Language 結構化查詢語言。由於其簡單易學、完整安全、靈活且具備高可擴展性,SQL 如今已經成為標準的關係型數據庫管理語言。
當連接到數據庫,寫下一條 SQL 語句,點擊“執行”,
SELECT name, company FROM product WHERE id=12345;
就會獲得結果:
name | company
------------+---------
PieCloudDB | OpenPie
(1 row)
你是否好奇,從點擊“執行”到看到結果的這段時間裏,到底發生了哪些神奇的事情呢?
首先,用來連接數據庫、編寫 SQL 的工具是數據庫的客户端軟件(又稱 Client),當我們編寫完 SQL 並點擊“執行”後,SQL 語句就從客户端傳到了數據庫服務器端(又稱 Server)。數據庫服務器收到 SQL 語句之後,就會開始它的表演。
SQL 語句的執行一般經過三個步驟:解析、優化、執行,而數據庫裏進行這三項操作的功能模塊稱為:解析器、優化器、執行器。分別負責對 SQL 語句進行詞法和語法分析、進行查詢優化和執行 SQL 語句。
首先,解析器會識別 SQL 語句中的詞語的含義,例如下面這個 SQL 語句中:
SELECT name, company FROM product WHERE id=12345;
“SELECT”、“FROM”、“WHERE” 會被識別為關鍵字,“product”被識別為表名,“name”和“company”將被識別為屬性名稱,而“id=12345” 將被識別為過濾條件。
接着,解析器會查詢數據庫的系統表信息(catalog),確定表名、屬性名是否存在。如果詞法語法正確,解析器生成 SQL 的抽象語法樹(abstract syntax tree, AST)。下面就是上述 SQL 例子對應的 AST 樹概述圖。
解析器的任務完成了,下面輪到優化器登場了。一條 SQL 語句有很多種執行方式,而優化器將依據 SQL 的解析樹(AST)生成最優的執行計劃(Execution Plan)。優化器會從計算複雜度和 IO 兩個方面進行優化。優化過程一般分為兩個階段:邏輯優化和物理優化。
邏輯優化是將 SQL 語句改寫為更加容易執行的等價形式,過濾條件的改寫(優化 where)、子查詢優化、子連接提升、謂詞下推等等;而物理優化則不同。這一階段會根據表中的數據的分佈特點,來選擇 SQL 的執行路徑。數據庫會定期收集表中的數據的統計信息,例如表中的元組數量、數據的分佈特點等。優化技術包括如何使用索引,多表連接時如何確定連接順序等。
拓數派旗下雲原生虛擬數倉 PieCloudDB Database 打造的優化器「達奇」針對用户雲上數據查詢性能需求對複雜查詢場景做了大量優化和改進,實現多階段聚集、聚集下推、預計算等高階優化。
執行計劃生成後,下面登場的是執行器。執行器會根據執行計劃執行各種操作,例如數據文件的掃描、數據的連接(join)等。還需要和存儲層(如 PieCloudDB 的存儲引擎簡墨)協作處理多種操作,包括事務、鎖、緩存等。
此外,PieCloudDB 新一代向量化執行引擎還會具有並行執行查詢計劃以及使用 SIMD 等指令進行加速等能力目前,PieCloudDB 向量化執行引擎已在業內常用的決策支持基準測試 TPCH 和 TPC-DS 中展現了令人矚目的性能提升。
待到執行計劃執行完畢,Server 端會把 SQL 的執行結果返回 Client 端,將執行結果展示給我們。
這就是 SQL 語句執行的全部過程,你學會了嗎?