PostgreSQL技術內幕:查詢優化深度探索 | 被動收入的投資秘訣 - 2024年8月
![](https://www.books.com.tw/img/CN1/154/97/CN11549738.jpg)
PostgreSQL技術內幕:查詢優化深度探索
查詢最佳化工具是資料庫中很重要的模組之一,只有掌握好查詢優化的方法且瞭解查詢優化的細節,在對資料庫調 優的過程中才能有的放矢,否則調優的過程就如無本之木、無源之水,雖上下求索而不得其法。本書揭示了PostgreSQL資料庫中查詢優化的實現技術細 節,首先對子查詢提升、外連接消除、運算式預處理、謂詞下推、連接順序交換、等價類推理等邏輯優化方法進行了詳細描述,然後結合統計資訊、選擇率、代價對 掃描路徑創建、路徑搜索方法、連接路徑建立、Non-SPJ路徑建立、執行計畫簡化與生成等進行了深度探索,使讀者對PostgreSQL資料庫的查詢優 化器有深層次的瞭解。本書適合資料庫內核開發人員及相關領域的研究人員、資料庫DBA、高等院校相關專業的本科生或者研究生閱讀。
張樹傑,北京大學工程管理碩士。2005年—2011年,從事安全相關的工作,涉及入侵偵測、資料庫審計、虛擬桌面等等。2011年—2015年,北京金倉資訊技術股份有限公司,從事資料庫內核開發工作。2015年—至今,天津神舟通用資料技術有限公司北京分公司,從事資料庫內核開發工作及團隊管理工作。
第1章 概述 1
1.1 查詢優化的簡介 1
1.2 邏輯優化 3
1.2.1 關係模型 3
1.2.2 邏輯優化示例 8
1.3 物理優化 10
1.3.1 物理優化的4個“法寶” 12
1.3.2 物理路徑的生成過程 14
1.4 檔介紹 17
1.5 示例的約定 18
1.6 小結 19
第2章 查詢樹 20
2.1 Node的結構 20
2.2 Var結構體 21
2.3 RangeTblEntry結構體 23
2.4 RangeTblRef結構體 25
2.5 JoinExpr結構體 26
2.6 FromExpr結構體 27
2.7 Query結構體 27
2.8 查詢樹的展示 31
2.9 查詢樹的遍歷 31
2.10 執行計畫的展示 32
2.11 小結 33
第3章 邏輯重寫優化 34
3.1 通用運算式 35
3.2 子查詢提升 36
3.2.1 提升子連接 37
3.2.2 提升子查詢 51
3.3 UNION ALL優化 68
3.4 展開繼承表 69
3.5 預處理運算式 71
3.5.1 連接Var的溯源 71
3.5.2 常量化簡 72
3.5.3 謂詞規範 73
3.5.4 子連接處理 79
3.6 處理HAVING子句 80
3.7 Group By鍵值消除 81
3.8 外連接消除 82
3.9 grouping_planner的說明 91
3.10 小結 92
第4章 邏輯分解優化 93
4.1 創建RelOptInfo 94
4.1.1 RelOptInfo結構體 94
4.1.2 IndexOptInfo結構體 97
4.1.3 創建RelOptInfo 100
4.2 初識等價類 102
4.3 謂詞下推 106
4.3.1 連接條件的下推 106
4.3.2 過濾條件的下推 112
4.3.3 連接順序 113
4.3.4 deconstruct_recurse函數 118
4.3.5 make_outerjoininfo函數 124
4.3.6 distribute_qual_to_rels函數 132
4.3.7 reconsider_outer_join_clauses函數 151
4.3.8 generate_base_implied_equalities函數 156
4.3.9 記錄表之間的等價關係 157
4.4 PlaceHolderVar的作用 158
4.5 Lateral語法的支援 161
4.5.1 Lateral的語義分析 162
4.5.2 收集Lateral變數 164
4.5.3 收集Lateral資訊 164
4.6 消除無用連接項 166
4.7 Semi Join消除 171
4.8 提取新的約束條件 172
4.8.1 提取需要滿足的條件 173
4.8.2 提取流程 174
4.8.3 選擇率修正 176
4.9 小結 177
第5章 統計資訊和選擇率 178
5.1 統計資訊 178
5.1.1 PG_STATISTIC系統表 181
5.1.2 PG_STATISTIC_EXT系統表 185
5.1.3 單列統計資訊生成 187
5.1.4 多列統計資訊生成 196
5.2 選擇率 200
5.2.1 使用函數依賴計算選擇率 204
5.2.2 子約束條件的選擇率 208
5.2.3 基於範圍的約束條件的選擇率修正 211
5.3 OpExpr的選擇率 213
5.3.1 eqsel函數 215
5.3.2 scalargtsel函數 217
5.3.3 eqjoinsel函數 220
5.4 小結 226
第6章 掃描路徑 227
6.1 代價(Cost) 228
6.1.1 代價基準單位 228
6.1.2 啟動代價和整體代價 231
6.1.3 運算式代價的計算 233
6.2 路徑(Path) 236
6.2.1 Path結構體 236
6.2.2 並行參數 237
6.2.3 參數化路徑 239
6.2.4 PathKey 242
6.3 make_one_rel函數 244
6.4 普通表的掃描路徑 245
6.4.1 順序掃描 246
6.4.2 索引掃描 248
6.4.3 點陣圖掃描 281
6.5 小結 291
第7章 動態規劃和遺傳演算法 292
7.1 動態規劃 293
7.1.1 make_rel_from_joinlist函數 297
7.1.2 standard_join_search函數 298
7.1.3 join_search_one_level函數 298
7.2 遺傳演算法 301
7.2.1 種群初始化 303
7.2.2 選擇運算元 308
7.2.3 交叉運算元 310
7.2.4 適應度計算 311
7.3 小結 312
第8章 連接路徑 313
8.1 檢查 314
8.1.1 初步檢查 314
8.1.2 檢查 316
8.1.3 “合法”連接 318
8.2 生成新的RelOptInfo 324
8.3 虛表 327
8.4 Semi Join和**化路徑 328
8.5 建立連接路徑 331
8.5.1 sort_inner_and_outer函數 334
8.5.2 match_unsorted_outer函數 345
8.5.3 hash_inner_and_outer函數 350
8.6 路徑的篩選 355
8.7 小結 360
第9章 Non-SPJ優化 361
9.1 集合操作處理 361
9.2 Non-SPJ路徑 367
9.2.1 Non-SPJ預處理 368
9.2.2 Non-SPJ路徑生成 376
9.3 小結 382
第10章 生成執行計畫 383
10.1 轉換流程 383
10.1.1 掃描計畫 384
10.1.2 連接計畫 390
10.2 執行計畫樹清理 391
10.3 小結 395