序1
白鱔
國內知名DBA專家
作為一個有二十多年信息繫統工作經歷的老DBA,我最近這十多年的主要工作是繫統優化,從最初的Oracle數據庫優化到現在的信息繫統整體優化、架構優化,這十多年來已經做過上百個案例。雖然做了十多年的優化,但老實說,SQL優化一直是我最不擅長、也最不願意去做的工作,雖然這些年我也被逼著做了不少SQL優化的工作,但我認為自己在這方面還存在缺陷。這些年和我搭檔做優化的老熊、老儲都是SQL優化方面的高手,在SQL優化方面,他們的能力和經驗都遠高於我。我也曾和老熊、老儲他們針對SQL優化工作做過交流,問他們能否寫一本這方面的書。他們雖然做過近十年的SQL優化,但也僅限於見招拆招,對於寫一本這方面的書,他們都覺得難度很大。SQL優化的難度很大,主要有以下方面原因。
首先是SQL優化工作十分繁雜,在一個維護得比較好的繫統中,需要優化的SQL往往都是業務邏輯十分復雜的SQL語句,而不是簡單地加一個索引就能解決問題,甚至有些SQL語句要打印十多頁紙,想要理解這樣的SQL語句的邏輯含義往往需要花上一段時間。
其次是SQL優化的方法與手段十分豐富,分析工具、分析方法及分析路徑紛繁復雜,不同的SQL可能需要用不同的分析思路進行分析,很難找到一條放之四海而皆準的準則。要想獲得這些方法隻有兩個途徑:一個是通過自己的實踐不斷總結和積累經驗;另一個是通過閱讀相關的書籍,獲得前人總結好的經驗。
雖然現在市面上有很多關於Oracle SQL優化的書籍,但絕大多數書籍中介紹的SQL優化僅僅介紹了SQL優化的工具如何使用,執行計劃如何解讀,以及SQL優化從大方向上該如何去做,所舉的例子也往往過於經典,不一定適用於我們的生產環境。特別是到目前為止,還沒有一本十分繫統地介紹SQL改寫技巧的書籍,而SQL改寫卻又是SQL優化中最難的一種工作,也是最實用的一種技術。
第一次看到本書時,其目錄讓我眼前一亮,這不是一本簡單堆砌知識的書籍,而是一本和大家分享工作經驗的書。從目錄結構就可看出作者對Oracle SQL執行內部機理的認知是十分深入的,同時有大量的SQL優化的實際工作經驗。本書從單表訪問路徑的基礎知識開始講起,將主要的SQL語法中可能的優化點進行一一剖析,總結了大量的優化實戰方法。特別值得一提的是,本書最後一章列舉了近60個實戰案例,內容覆蓋大多數DBA的日常工作場景,具有相當大的實用價值。
本書的寫作手法十分樸實,甚至可以說有些章節有點過於簡練,但是瑕不掩瑜,書中實用的內容之多是十分值得肯定的。本書可以作為DBA的參考書籍,也可以作為開發人員編寫SQL的指導書籍。作為DBA行業的一個老兵,我願意向大家推薦本書,對優化有興趣的DBA,確實有必要讀一讀本書。
序2
黃超(網名:道道)
道森教育集團負責人,資深Oracle培訓人員
當教主告訴我他準備寫一本有關SQL編程改寫的書時,我非常高興,感覺到將會有一大批開發人員可以借助這樣一本書將自己的SQL水平提升一個層次。因為我知道這不會是一本SQL入門的書,也不是一本專門講優化理論的SQL優化書籍,而是一本結合常見的開發場景介紹編程技巧的書籍。教主擁有多年的軟件開發和SQL開發經驗,從和他的技術交流中,我也學到了很多SQL技巧,更難得的是,他對同一個SQL有多種不同的寫法,結合一些SQL優化的原理,很容易找到非常高效的寫法。
教主為人低調,熱心幫助他人,並且在博客上經常分享一些SQL技巧和相關知識。感謝他的無私奉獻,同時期望教主能堅持下去,不斷總結他豐富的SQL開發經驗,並與我們一起溝通交流。
前言
因開辦了Oracle優化改寫的在線培訓,在教學和答疑的過程中有很多讀者希望我能推薦一些相關的學習書籍。說實話,有關Oracle的書籍非常多,但在給讀者推薦書籍時我發現特意針對優化改寫的書籍不好找,因為很多資料注重各種語法的實現,對優化方面的知識考慮得較少,而介紹優化知識的書籍對改寫知識涉及得也不多。因此,和落落商量後,嘗試編寫了本書。
本書共分14章,各章的主要內容如下。
√第1章介紹初學者在NULL上常犯的錯誤、字符串中單引號的處理方式及模糊查詢時對通配符的轉義。
√第2章講述了ORDER BY的用法及TRANSLATE的特殊用法。
√第3章是基礎知識的重點內容,需要掌握好各種連接的寫法及為什麼要左聯、右聯,以及過濾條件錯誤地放在WHERE裡會有什麼影響;當數據有重復值時要直接關聯還是分組彙總後再關聯。
√第4章介紹了UPDATE語句的正確用法,以及什麼時候UPDATE語句應改寫為MERGE。
√第5章以案例的形式講解了正則表達式的用法,對正則表達式的基礎語法不熟悉的讀者可以通過官方文檔或我的博客來學習,這裡面對字符串的拆分方法可以直接套用,而對字符串的分組處理難度稍高,不常處理類似數據的讀者可以略過。
√第6章介紹了常用分析函數的幾個案例,在大部分情況下使用分析函數會讓查詢速度得到很大提升。所以,如果想熟練地改寫,就必須熟悉分析函數的應用。另外,本章還對很多人感到模糊的max() keep()語句進行了分析。
√第7、8章講了DATE類型的常見用法。
√第9章仍然介紹分析函數,希望本章內容對範圍的處理能給讀者一些借鋻。
√第10章的重點是結果集的分頁,要弄清楚如何分頁,為什麼Oracle的分頁會寫得那麼復雜,等等。
√第11章講述了行列轉換函數,並對兩個函數進行了剖析,理解了其中的原理就可以用UNPIVOT對UNION ALL做一定的優化。本章的另一個重點就是分組彙總小計的統計,熟練掌握ROLLUP及CUBE可以讓你少寫一些UNION ALL語句。
√第12章能幫助讀者在寫樹形查詢時減少不必要的錯誤,生成更準確的數據。
√第13章選取了部分網友的需求案例,希望讀者能通過這些案例的啟發找到實現自己需求的思路。
√第14章選取了能覆蓋目前大部分改寫方法的案例。讀者需要在對前面內容熟悉的基礎上來學習這些案例。各種改寫方法能否提高速度都與對應的環境有關,所以掌握更多的優化知識和改寫方法對優化有很大的幫助。
在此要特別感謝白鱔老師和我們的同事道道給本書作序,通過白鱔老師寫的序可以看到,他認真閱讀了本書並給出非常中肯的評價,能在百忙之中花費大量時間耐心地把我寫的書看完,確實非常令人感動。另外,還要感謝出版社的各位編輯,有很多地方詞不達意,是他們給我指出了錯誤的地方,並給出了改正意見。
《Oracle查詢優化改寫技巧與案例2.0》在《Oracle查詢優化改寫技巧與案例》的基礎上進行了如下更新。
√所有代碼都重新執行了一遍,以減少謬誤。
√為了提高清晰度,盡量刪除了圖片,改用文本方式展示案例結果。
√為了提高閱讀效率,刪除了平時較少用到的內容。
√為了提高可讀性,大部分案例都改用了SAMPLE中的數據,這樣讀者可以更容易地驗證代碼及思路。
√刪除了實用性不高的實戰案例,另增加了部分實戰案例(詳見最後兩章)。
因水平有限,本書在編寫過程中難免有錯漏之處,懇請讀者批評、指正。
作 者