- SQL優化最佳實踐:構建高效率Oracle數據庫的方法與技巧
- 韓鋒
- 2958字
- 2019-01-03 03:13:26
前言
為什么要寫這本書
我早年畢業后,曾長期從事ERP、電子政務類軟件的開發工作,作為一個數據庫的使用者,我接觸到了大量數據庫,如FoxPro、SQL Server、Oracle、Informix……在不斷的使用過程中,我對這一領域越來越感興趣,并最終選擇了數據庫這條路。曾經長期擔任DBA、數據庫架構師等職,參與了大大小小很多項目的數據庫設計、開發、優化工作,并在這一過程中積累了一些經驗。在多年的工作中,我發現數據庫領域存在一些現象。
現象一,開發人員將數據庫視為“黑盒子”。開發人員不關心、不重視,也不了解SQL語句的執行情況、數據庫的運行機理。甚至在很多O/R Mapping工具的輔助下,連基本的SQL語句也不需要手工編寫。固然,通過引入這些工具可以大大加快研發速度,但其帶來的弊端是,開發人員并不了解數據庫是如何完成這些請求并獲得數據的,優化更是無從談起。
現象二,對SQL質量重視程度不足。我在長期的工作中發現,絕大多數公司對SQL質量的重視程度嚴重不足。往往在項目的前期設計、代碼開發、測試等多個環節,都沒有DBA的參與。直到項目上線,甚至到出現性能問題時,才會有DBA介入處理。這種救火員的模式,往往效果不好,即使有了解決方案,其代價、成本也必然是巨大的。
現象三,開發人員想提高卻無從下手。有些開發人員認識到SQL語句質量的重要性,想要提高卻無從下手。一方面,他們本身不具備數據庫的專業知識;另一方面,SQL編程本身也有其特殊性,與其他常用開發語言有較大差異。正是這些因素,導致開發人員想要提高卻困難重重。
現象四,重運行維護,輕開發優化。數據庫的穩定運行、數據安全等是非常重要的,這也是DBA的核心職責之一。但對于開發優化,則往往存在重視程度不足的問題。我們經常會看到一個項目里,公司會花大筆費用購買昂貴的硬件、備份軟件等,卻不舍得購買與數據庫優化、SQL審計相關的軟件。此外,隨著自動化運維的逐步推廣,乃至數據庫云服務的逐步成熟,傳統意義的數據庫運維工作必然會逐步萎縮,取而代之的則是數據庫的設計、開發乃至整體架構工作逐步增多。這也是DBA未來發展的一個方向。
現象五,資料繁多,卻無從選擇。Oracle數據庫在國內流行多年,該領域的書籍也非常多,但涉及優化類的相對較少,特別是局限在SQL語句優化范疇的。近年來我也發現了幾本不錯的書籍,但普遍存在技術偏深、可操作性不強的問題。廣大數據庫開發的初學者或者有一定經驗但急需提高的讀者,不太適用。
正是因為存在上述種種現象,促使我有了將多年的經驗匯集成冊,編寫出版的想法。一方面是能夠幫助有相關需求的人,另一方面也是對自己多年工作的一個總結。最后,希望這本書能夠引領開發人員、DBA在SQL語句的編寫優化上更進一步。倘若這本書能夠幫助大家解決實際中遇到的問題,我將非常榮幸。
本書特色
本書從多角度闡述了SQL語句優化的方方面面,總體上可分為兩大部分。第一部分主要講解跟SQL優化相關的背景知識和基本原理;第二部分重點講述了優化器的各種優化手段。本書整體具有以下幾個特點:
- 書中內容由項目而生,以一線開發工程師的視角和言語展開。
- 注重實戰。幾乎所有的章節都配以代碼,讀者可在環境中直接編寫代碼并運行。大部分代碼都附有詳細的說明,便于讀者理解內容。
- 涵蓋了SQL語句的諸多方面,特別是第二部分,可作為工作手冊供大家優化時查閱使用。
讀者對象
本書適用于想要提高SQL語句運行效率乃至數據庫整體性能的所有人,包括架構師、DBA、開發人員、測試人員等。書中講解了Oracle數據庫的SQL語句優化,但除了個別Oracle自有的優化特性外,其核心思想也適用于其他關系型數據庫。書中沒有講解Oracle體系結構和SQL語言本身,這里假設大部分人已熟悉Oracle和SQL語言。具體來說,包括但不局限于下列人員:
- Oracle數據庫開發人員;
- 數據庫架構師、數據庫管理員;
- 其他關系型數據庫的從業者;
- 對SQL語句優化感興趣的人員;
- 大專院校計算機相關專業的學生。
如何閱讀本書
本書分為四大部分:
第一部分為引入篇(第0~1章)。
引言部分我結合多年的工作經驗,總結了進行SQL語句優化時可能會面臨的一些問題。讀者可以觀察是否在自己的身邊也存在類似的問題。后面還講述了一些常見的關于SQL優化的誤區,以方便讀者正確看待SQL語句優化。
第1章講述了我曾經處理過的幾個案例。通過這些活生生的案例,可以讓讀者更直觀感受到SQL語句優化的重要。同時在每個案例后面,我還針對案例出現的問題進行了總結。
第二部分為原理篇(第2~9章)。
第2章講述了SQL語句優化的核心組件——優化器,以及優化的最基礎概念——成本。這部分非常重要,建議初學者仔細閱讀。
第3~6章介紹了和優化相關的幾個重要概念:執行計劃、統計信息、SQL解析、游標、綁定變量。這部分都較為基礎,建議初學者根據情況選擇閱讀。
第7~8章介紹了SQL語句的實體對象及物理上是如何存儲的。這部分對于數據庫結構設計有較大幫助。此外,在對SQL語句進行優化時,也需要考慮相關對象的情況,因為優化措施可能會影響該對象的其他語句,需要統籌考慮。
第9章介紹了Oracle專有的一些SQL語句。有時使用這些語句,可以達到意想不到的效果。如不考慮以后有數據庫平臺遷移的問題,可以充分利用這些語句。
原理篇是我們是邁入實戰篇的基礎,它幾乎覆蓋了SQL優化相關的所有原理知識。通過對這些內容的學習,可以為后面的優化部分打下良好的基礎。如果你已經擁有相關知識,可以直接進入實戰篇。
第三部分為實戰篇(第10~16章)。它是本書的重點。
第10章介紹了一個重要的優化手段——查詢轉換。這部分相對來說比較難,相關資料說明較少,可作為重點來看。
第11章介紹了數據對象的訪問方式。這部分也非常基礎,應重點來看。
第12~16章介紹了多種操作及常見的優化手段,包括表關聯、半/反連接、子查詢、排序、并行等。這部分讀者可根據實際需要進行有重點的閱讀。
實戰篇是本書的重點,這部分覆蓋了常見優化的多個方面。讀者可將這部分作為參考資料,當需要時反復閱讀。這部分還包含了大量示例代碼,讀者可以通過實踐反復體會。
本書還提供了讀者可能感興趣的拓展知識,放在附錄。
附錄介紹了前面各章節提到的數據庫參數、數據字典、等待事件、提示等內容。此外,還包括如何構造樣例數據,方便讀者進行實際操作。
以上是本書各個章節的安排情況和寫作思路,希望有助于讀者閱讀。
勘誤和支持
由于筆者水平有限,加之編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。大家可以通過郵箱hanfeng7766@sohu.com與我取得聯系。你可以將書中的錯誤和問題反饋給我,我將盡量在線上為你提供最滿意的解答。期待能夠得到你的真摯反饋。
致謝
感謝每一位幫助過我的老師、同事和領導,是你們讓我有了學習和總結的機會。感謝宜信公司的各級領導、同事對我的支持和鼓勵,你們的支持充分體現了宜信開放、分享的企業文化。此外,也要感謝我的老東家——當當網,在那里我積累了豐富的經驗,并堅定了完成本書的信心。
感謝機械工業出版社華章公司的編輯孫海亮,在這一年多的時間中始終支持我的寫作。第一次著書寫作,過程漫長而艱辛,正是你的鼓勵和幫助引導我順利完成全部書稿。
感謝遠在哈爾濱的爸爸、媽媽和姐姐,是你們在艱苦環境下將我培養成人,并時時刻刻為我灌輸愛的力量!感謝我的岳父母,是你們承擔了瑣碎的家務,讓我能安心寫作。最后,也是最重要的,一如既往地感謝陪伴我左右的妻子和孩子,你們的愛和支持是本書得以完成的最大動力。
謹以本書獻給我最親愛的家人和朋友,以及正在為自我實現而奮斗的、充滿朝氣的IT工程師們!
韓鋒