本章概述了查詢處理,尤其是查詢優化。
本章包括以下三個部分:
3.1節概述postgresql中的查詢處理
本部分解釋了獲得單錶查詢的最優計畫所遵循的步驟。在3.2和3.3節中,分別解釋了估算成本和建立計畫樹的過程。3.4節簡要描述了執行操作
本部分闡述了多表查詢的最優方案的獲取過程。在3.5節中,描述了3種連線方法:巢狀迴圈、合併和雜湊連線。在3.6節中,解釋了建立多表查詢計畫樹的過程。
在postgresql中,雖然在9.6版中使用多個後台工作程序實現了並行查詢,但後端程序基本上處理了由連線的客戶機發出的所有查詢。該後端由五個子系統組成,如下圖所示:
解析器(parser)
解析器以純文字行式從sql語句生成分析樹。
分析器(analyzer/analyser)
分析器對分析樹進行語義分析並生成查詢樹。
重寫器(rewriter)
如果存在規則,則重寫器使用儲存在規則系統中的規則轉換查詢樹。
規劃器(planner)
規劃器從查詢樹生成最有效的執行計畫樹。
執行器(executor)
執行器通過按照計畫樹建立的順序訪問表和索引來執行查詢。
在本節中,提供了這些子系統的概述。由於planner和executor非常複雜,因此將在以下各節中提供這些功能的詳細說明。
postgresql的查詢處理在官方文件中有詳細描述。解析器以純文字方式從sql語句生成乙個分析樹, 後面的子系統可以讀取該分析樹。下面顯示了乙個具體的示例, 但沒有詳細的說明。
testdb=# select id, data from tbl_a where id <
300order
by data;
分析樹的根節點是在parsenode.h中的selectstmt定義。圖3.2(b)說明了圖3.2(a)所示的查詢的分析樹。
select查詢的元素和相應的分析樹元素編號相同。例如,(1)是第乙個目標列表的乙個專案,它是該錶的列"id", (4)是where子句,依此類推。
由於解析器在生成分析樹時只檢查輸入的語法,因此它在查詢中存在語法錯誤時才返回錯誤。
解析器不檢查輸入查詢的語義。例如,即使查詢包含不存在的表名,解析器也不會返回錯誤。語義檢查由analyzer/analyser進行。
PostgreSQL學習筆記 陣列型別
postgresql 支援一維陣列和多維陣列,常用的陣列型別為數字型別陣列和字元型陣列,也支援列舉型別 復合資料型別。首先建立一張帶有陣列型別的表,sql 語句如下 create table t course id integer title varchar 50 contentids intege...
PostgreSQL 學習總結
xy copy 命令用於批量的資料匯入或匯出 c 介面如下 主要為一下三個函式 pres pqexec pconn,strsql.c str pqputcopydata pconn,strbuf.c str strbuf.length pqputcopyend pconn,strerrormsg 其...
postgresql筆記幾則
1.select count from a,統計所有資料報括null資料,這裡會使用到聚合索引,如果判斷聚合索引可以加快速度.2.select count a from a,這裡統計a列資料,除去null資料,如果select count 1 from a,之類的引數非表a列統 計所有資料.3.se...