什么是查詢引擎
可以把他理解成一個網關,對于數據庫來說它叫查詢引擎,對于對象存儲來說,它就是一個rgw(ceph),作用都是將用戶的查詢語句轉化成存儲引擎能處理的調用;
datafusion
不同的數據庫實現了不同細節的查詢引擎,但是大致相似,正因此,出現了datafusion,旨在統一查詢引擎,減少重復造輪子,我們以datafusion做基礎來介紹sql查詢引擎需要哪些能力,如果對細節有興趣可以看duckdb的實現,非常完美和標準化;
語法解析
簡單的關鍵詞匹配,將其轉換成抽象語法樹,比如select * from table1;
匹配到第一個單詞是select,那么產生一個掃表(scan table)的節點,這個節點的參數是:projection: *, table_name: table1,
注:projection就是投影,可理解為在一個大集中取子集就是投影;
這是一個簡單的查詢語句,產生只有一個節點的抽象語法樹
創建邏輯計劃
所以邏輯計劃,可以理解為一個接口,這個計劃規定要做什么,但是不規定怎么做
語義解析
剛剛的語法解析只是簡單的關鍵字匹配,然后生成的邏輯計劃,但是對于同一個關鍵字,在不同的語義下可以產生不同的邏輯計劃,比如,projection中是否含有索引,如果有那就生產基于索引的掃表,如果沒有,就產生全量的掃表,二者的實現會不一樣,
邏輯計劃優化
根據制定的優化規則進行優化,最常見的就是謂詞下推,讓計算更靠近數據源,減少數據的傳輸;
創建物理計劃
物理計劃就是邏輯計劃的具體實現,比如一個掃表操作,邏輯計劃只是指明掃表這個目的,那么物理計劃就是掃表的具體細節,比如:任務應該發送到哪個存儲節點,limit,projection,謂詞處理這些