1. 程式人生 > >《PostgreSQL技術內幕:查詢優化深度探索》前言

《PostgreSQL技術內幕:查詢優化深度探索》前言

為什麼寫這本書

      我參加過很多次查詢優化的培訓,也查閱過不少查詢優化的資料,但總是感覺對查詢優化隔靴搔癢,似懂而非,我總結其中的原因是多數培訓和資料的時長或篇幅較短,其內容多是對查詢優化的概述,“巧妙”的避開了查詢優化的難點,這都使得讀者難以觸及到查詢優化的本質,導致查詢優化的“大道理”人人都懂,但遇到問題卻難以發力。

      在2016年末,我承擔了一次查詢優化的培訓,結合之前培訓的經驗,我對這次查詢優化的培訓打了一個“持久戰”,不只是僅僅拿出幾個小時的時間對查詢優化進行一個總體描述,而是將查詢優化器拆解開來,分階段的進行詳細的解讀,大約做了十幾次培訓,最終的效果實際上還是非常顯著的。在培訓的過程中我發現目前PostgreSQL資料庫查詢優化器的實現細節相關的資料在市場上少之又少,和資料庫從業人員對查詢優化器的熱情遠遠不成正比,本著拋磚引玉的原則,我寫了這本書。

為什麼閱讀這本書

  •             在資料庫核心開發的過程中,你是否對查詢優化器的實現細節有了解的慾望?
  •             在對資料庫進行調優的過程中,你是否感覺無從下手?
  •             在分析查詢優化的原始碼時,你是否會陷入某一細節而不可自拔?
  •             在學習查詢優化的理論時,你是否感覺理論與實踐之間無法一一對應?

      如果你希望深入的瞭解查詢優化,那麼最好的辦法就是了解它的理論基礎,然後細緻的剖析查詢優化器的原始碼,通過理論和實踐的結合,達到真正掌握相關知識的目的。本書則細緻的解讀了PostgreSQL10.0版本的查詢優化器的大部分原始碼,對其中比較重要的理論都給出說明,相信已經足以讓讀者瞭解PostgreSQL資料庫查詢優化器的全貌。

      雖然本書已經儘量嘗試通過比較多的圖表、示例來將複雜問題簡單化,但是鑑於PostgreSQL資料庫的查詢優化器的實現本身就具有一定的複雜性,我相信讀者在閱讀的過程肯定是“痛苦”的,但請相信梅花香自苦寒來,只要堅持閱讀肯定能獲得不菲的收穫。

本書的組織結構

      本書的組織流程基本是按照PostgreSQL資料庫的查詢優化器處理一個查詢的流程來解讀的,按照由簡入繁、由易入難的的情況進行組織。

      第一章介紹的是一些查詢優化的基礎理論,這些理論是對查詢優化的概述,讀者在閱讀第一章時可以參考一些經典的資料庫實現理論的相關書籍,更詳細的瞭解資料庫的基本理論,這樣能給後面的閱讀打好基礎。

      第二章介紹的是查詢樹,查詢樹是PostgreSQL資料庫查詢優化器的輸入,查詢優化器本身是對查詢樹的等價改造以及等價分解。

      第三章介紹的是邏輯重寫優化,邏輯重寫優化屬於邏輯優化的一部分,它主要是對查詢樹進行基於規則的等價重寫,比較重要的包括子查詢提升、表示式預處理、外連線消除等。

      第四章介紹的是邏輯分解優化,邏輯分解優化仍然屬於邏輯優化的一部分,和邏輯重寫優化不同,它開始嘗試分解查詢樹,經過謂詞下推、連線順序交換、等價類推理等等對查詢樹進行改造。

      第五章介紹的是統計資訊和選擇率,統計資訊是代價計算的基石,因此瞭解統計資訊的型別、瞭解選擇率的含義對了解代價計算的過程有非常重要的意義。

      第六章介紹的是掃描路徑的建立過程,掃描路徑是為了對基表進行掃描的物理運算元建立的路徑,它負責將物理儲存或者快取中的資料讀取上來進行處理,通常包括順序掃描、索引掃描、點陣圖掃描等等。

      第七章介紹的是路徑搜尋的2個演算法,PostgreSQL資料庫採用了動態規劃方法和遺傳演算法進行路徑的搜尋,本書對這兩種方法的實現都做了詳細的介紹。

      第八章介紹的是連線路徑的建立過程,PostgreSQL資料庫的物理連線路徑有巢狀迴圈連線、雜湊連線、歸併連線等,由於採用的掃描路徑不同,導致同一種類型的物理連線路徑產生的代價不同。

      第九章介紹的是Non-SPJ的相關優化,PostgreSQL資料庫對集合操作、聚集操作、分組操作、排序操作等都做了優化處理。

      第十章介紹的是執行計劃的生成,在掃描路徑、連線路徑以及Non-SPJ路徑分別處理之後,會選擇出一個“最優”的連線樹,PostgreSQL資料庫需要將這個連線樹修正成執行計劃。

錯誤

      限於作者的能力,書中一定有不少錯誤,在寫作的過程中我也嘗試儘量的多查閱相關的資料,儘量避免錯誤的出現,但是相關的資料實在是太少了,因此,我歡迎廣大的讀者對本書提出糾正、批評和意見,這也有益於作者本身能力的提升。

致謝

      感謝彭煜瑋、周正中(德哥)樂為做序,感謝蔣志勇、文繼軍、王穎澤、楊瑜為本書做的推薦,這對我是極大的鼓勵。

      在書稿的寫作過程中,盧棟棟、彭信東、李茂增通讀了大部分書稿,給出了很多有益的意見和建議,在此表示感謝。 林文、翁巖青、白潔對書稿的格式以及內容提出了修改建議,在此一併表示感謝。

      感謝編輯董英,在本書的寫稿以及後續的審校過程中一直是董英編輯和我溝通,不厭其煩的解答我的各種問題。

      感謝我的父母和妻子在我寫作的過程中給予了極大的支援,寫作的過程非常枯燥,他們給我提供了最好的寫作環境,另外我的兩個兒子邦邦和添添也經常在我離開電腦的間隙裡幫我修改書稿,雖然他們的意見一條也沒有被採納,但仍然對他們的“貢獻”表示感謝。