-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
防疫期間 門市僅限取書, 不開放參觀
並提早到6點打烊, 星期日公休
8/3 新書到! 7/27 新書到! 7/20 新書到! 7/14 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

PostgreSQL技術內幕:查詢優化深度探索

( 簡體 字)
作者:張樹杰類別:1. -> 資料庫 -> PostgreSQL
譯者:
出版社:電子工業出版社PostgreSQL技術內幕:查詢優化深度探索 3dWoo書號: 49218
詢問書籍請說出此書號!

有庫存
NT定價: 395
折扣價: 371

出版日:6/1/2018
頁數:412
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121341489
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

序一

查詢可以說是數據庫管理系統中最關鍵、最吸引人的功能之一,每一個生產數據庫系統每天都需要處理大量的各類查詢,為了讓這些查詢運行得更快、更好,數據庫管理系統的查詢優化器中包含了大量的優化技術,這些優化技術是很多研究者和技術人員數十年鉆研和探索總結出來的精華。不論是數據庫管理系統的開發者還是數據庫應用的開發者,學習理解查詢優化技術都大有裨益。
作為最先進的開源對象關系型數據庫管理系統,PostgreSQL及其源代碼無疑是學習和體會查詢優化技術的最佳平臺。除此之外,高質量技術書籍也是研究查詢優化技術必不可少的武器。本書結合PostgreSQL的查詢優化器源代碼,深入分析了一個查詢進入PostgreSQL之后一步步被查詢優化器轉換成一個可執行的、優化后的執行計劃的全過程。為了讓讀者更容易理解,本書還配備了大量的實例來講解,確實是一部值得一讀的好書。
身為一名PostgreSQL愛好者和數據庫研究人員,我感到無比幸福和自豪—據我有限的知識,全球僅有幾本分析PostgreSQL內核的書籍,而它們全都出自中國作者之手。希望今后有更多、更好的此類書籍面世,也祝愿中國的數據庫技術和產品有朝一日能夠走向世界。

彭煜瑋
2018.4.25于珞珈山

序二

中國有句古話,“巧婦難為無米之炊”,說的是再好的主婦,在沒有給任何食材的情況下也做不出可口的飯菜。反過來,什么樣的主婦算得上“巧婦”呢?如果給你準備好了烹調所需的所有食材,你能做出可口的飯菜嗎?
數據庫是一個比較神奇的軟件,我們都知道可以用SQL和數據庫溝通,讓數據庫處理SQL和讓主婦做飯是一樣的道理,數據庫能不能及時響應SQL請求,能不能用最優的計劃完成SQL請求,取決于數據庫本身提供了哪些“料”,以及數據庫打算怎么“烹調”用戶提交的SQL。例如,一個簡單查詢SQL,數據庫的掃描方法(我暫且把它稱為數據庫的“料”之一)就有全表掃描、索引掃描、位圖掃描、跳躍掃描等。一個SQL中包括了多個函數、表達式時,數據庫先處理哪個表達式或函數,又或者在什么時候處理這些表達式或函數呢?數據庫“烹調”一條SQL時,如何“烹調”,如何分解,是靠什么來做決定的?在數據庫決定了怎么做之后,又是如何按部就班地執行的?如果說數據庫的“掃描方法、表達式、操作符、UDF、索引接口”等是數據庫的“料”,那么數據庫的優化器就是“巧婦”之手,它包括了“JOIN算法、SQL重寫規則、多表JOIN的遺傳算法、動態路徑規劃、選擇性算法、各種NODE的成本計算算法、成本因子、并行計算成本算法”等方方面面,為數據庫如何執行SQL提供了全套流程。
PostgreSQL作為一個非常經典的ORDBMS,包含了很多“料”,同時有著非常先進的優化器,為高效地執行SQL提供了良好的基礎。
本書作者長期致力于數據庫內核的研發,有非常豐富的理論與實踐經驗,本書以PostgreSQL為背景,詳細介紹了PostgreSQL查詢優化器中的核心概念,從“查詢樹、SQL重寫、UNION 優化、邏輯分解”到“下推、JOIN、選擇性、統計信息、掃描路徑、動態規劃、遺傳算法”等方方面面,實為作者嘔心瀝血之作,同時也是數據庫工作者,特別是PGer之福。
本書是不可多得的教科書級PostgreSQL內核讀物,同時不乏實戰性。建議想了解數據庫優化器工作原理的讀者及PostgreSQL愛好者深入學習。
感謝作者為PostgreSQL生態的辛勤付出,期待本書大賣。

PGer,Digoal



前  言


為什么寫這本書
我參加過很多次查詢優化的培訓,也查閱過很多查詢優化的資料,但總是感覺對查詢優化似懂而非,我總結其原因是多數培訓和資料的時長或篇幅較短,內容多是對查詢優化的概述,“巧妙”地避開了查詢優化的難點,難以觸及查詢優化的本質,導致查詢優化的“大道理”人人都懂,遇到問題卻難以發力。
2016年年末,我做了一次查詢優化的培訓,結合之前培訓的經驗,我對這次查詢優化的培訓打了一個“持久戰”,不只是拿出幾個小時的時間對查詢優化進行一個總體描述,而是將查詢優化器拆解開來,分階段地進行詳細的解讀,大約做了十幾次培訓,最終的效果是非常顯著的。在培訓的過程中我發現,目前PostgreSQL數據庫查詢優化器實現細節相關的資料市場上少之又少,和數據庫從業人員對查詢優化器的熱情遠遠不成正比,本著拋磚引玉的原則,我寫了這本書。
為什么閱讀這本書
? 在數據庫內核開發的過程中,你是否有了解查詢優化器的實現細節的欲望?
? 在對數據庫進行調優的過程中,你是否感覺無從下手?
? 在分析查詢優化的源碼時,你是否會陷入某一細節而不可自拔?
? 在學習查詢優化的理論時,你是否感覺理論與實踐之間無法一一對應?
如果你希望深入地了解查詢優化,那么最好的辦法就是了解它的理論基礎,然后細致地剖析查詢優化器的源代碼,通過理論和實踐的結合,達到真正掌握相關知識的目的。本書細致地解讀了PostgreSQL 10.0的查詢優化器的大部分源碼,對其中比較重要的理論都給出了說明,足以讓讀者了解PostgreSQL數據庫查詢優化器的全貌。
雖然本書已經盡量嘗試將復雜問題簡單化,但是鑒于PostgreSQL數據庫的查詢優化器的實現本身就具有一定的復雜性,讀者閱讀的過程可能是“痛苦”的,但請相信“梅花香自苦寒來”,只要堅持閱讀就能收獲很多。
本書的組織結構
本書的組織結構基本是按照PostgreSQL數據庫的查詢優化器處理一個查詢的流程來安排的,由簡入繁、由易入難。
第1章介紹一些查詢優化基礎理論,這些理論是對查詢優化的概述,讀者在閱讀第1章時可以參考一些經典的數據庫實現理論書籍,更詳細地了解數據庫的基本理論,這樣能給后面的閱讀打好基礎。
第2章介紹查詢樹,查詢樹是PostgreSQL數據庫查詢優化器的輸入,查詢優化器本身是對查詢樹的等價改造及等價分解。
第3章介紹邏輯重寫優化,邏輯重寫優化是邏輯優化的一部分,它主要是對查詢樹進行基于規則的等價重寫,比較重要的有子查詢提升、表達式預處理、外連接消除等。
第4章介紹邏輯分解優化,邏輯分解優化仍然是邏輯優化的一部分,和邏輯重寫優化不同,它開始嘗試分解查詢樹,經過謂詞下推、連接順序交換、等價類推理等對查詢樹進行改造。
第5章介紹統計信息和選擇率,統計信息是代價計算的基石,因此了解統計信息的類型、了解選擇率的含義對代價計算有非常重要的意義。
第6章介紹掃描路徑的建立過程,掃描路徑是為了對基表進行掃描的物理算子創建的路徑,它負責將物理存儲或者緩存中的數據讀取上來并進行處理,通常包括順序掃描、索引掃描、位圖掃描等。
第7章介紹路徑搜索的兩個算法,PostgreSQL數據庫采用了動態規劃方法和遺傳算法進行路徑搜索,本書對這兩種方法的實現都做了詳細的介紹。
第8章介紹連接路徑的建立過程,PostgreSQL數據庫的物理連接路徑有嵌套循環連接、哈希連接、歸并連接等,由于采用的掃描路徑不同,導致同一種類型的物理連接路徑產生的代價不同。
第9章介紹Non-SPJ的相關優化,PostgreSQL數據庫對集合操作、聚集操作、分組操作、排序操作等都做了優化處理。
第10章介紹執行計劃的生成,在掃描路徑、連接路徑及Non-SPJ路徑分別處理之后,會選擇一個“最優”的連接樹,PostgreSQL數據庫需要將這個連接樹修正成執行計劃樹。
錯誤
限于我的能力,書中難免有錯誤,在寫作的過程中我也嘗試盡量多查閱相關的資料,盡量避免錯誤的出現,但是相關的資料實在是太少了,因此,歡迎廣大讀者對本書提出糾正、批評和意見,這也有益于我本身能力的提升。
致謝
感謝彭煜瑋、周正中(德哥Digoal)為本書作序,感謝蔣志勇、文繼軍、王穎澤、楊瑜、趙殿奎對本書的評價,這對我是極大的鼓勵。
在寫作過程中,盧棟棟、彭信東、李茂增通讀了大部分書稿,給出了很多有益的意見和建議,在此表示感謝。林文、翁燕青、白潔對書稿的格式及內容提出了修改建議,在此一并表示感謝。
感謝董英編輯,在寫稿及后續的審校過程中董英編輯一直在和我溝通,不厭其煩地解答我的各種問題。
感謝我的家人。我的父母和妻子在我寫作的過程中給予了極大的支持,寫作的過程非常枯燥,他們為我提供了最好的寫作環境。另外我的兩個兒子也經常在我離開電腦的間隙幫我修改書稿,雖然他們的意見一條也沒有被采納,但這里仍然對他們的“貢獻”表示感謝。
讀者服務
輕松注冊成為博文視點社區用戶,掃碼直達本書頁面。
? 提交勘誤:您對書中內容的修改意見可在 提交勘誤 處提交,若被采納,將獲贈博文視點社區積分(在您購買電子書時,積分可用來抵扣相應金額)。
? 交流互動:在頁面下方 讀者評論 處留下您的疑問或觀點,與我們和其他讀者一同學習交流。
內容簡介:

查詢優化器是數據庫中很重要的模塊之一,只有掌握好查詢優化的方法且了解查詢優化的細節,在對數據庫調優的過程中才能有的放矢,否則調優的過程就如無本之木、無源之水,雖上下求索而不得其法。本書揭示了PostgreSQL數據庫中查詢優化的實現技術細節,首先對子查詢提升、外連接消除、表達式預處理、謂詞下推、連接順序交換、等價類推理等邏輯優化方法進行了詳細描述,然后結合統計信息、選擇率、代價對掃描路徑創建、路徑搜索方法、連接路徑建立、Non-SPJ路徑建立、執行計劃簡化與生成等進行了深度探索,使讀者對PostgreSQL數據庫的查詢優化器有深層次的了解。本書適合數據庫內核開發人員及相關領域的研究人員、數據庫DBA、高等院校相關專業的本科生或者研究生閱讀。

目錄:

第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
序: