編輯推薦
15年資深DBA經驗總結,從100餘個一綫實例中總結齣的SQL優化原理、技巧和要點
15年DBA經驗結晶,依托近百個真實案例,詳細剖析SQL語句優化的原理、方法及技術要點,所講內容均可直接落地。
所有內容均來自一綫真實項目,以一綫開發工程師的語言和視角展開介紹,無論是初學者還是中端技術人員,都可輕鬆接受、吸收
Oracle數據庫使用十分廣泛,長期盤踞數據庫使用排行榜首位。而SQL語句作為訪問數據的接口語言,其運行效率的高低直接決定瞭數據庫的整體性能。SQL語句優化本身覆蓋麵較廣,涉及數據庫領域的諸多方麵,其中優化器部分尤為復雜。
本書作者根據多年的工作經驗,圍繞SQL優化這一核心主題,多角度闡述瞭SQL語句優化的各個方麵。內容兼顧技術的深度和廣度,結閤大量案例,方便讀者更好地瞭解SQL語句優化的本質。本書特彆適閤廣大從事數據庫開發工作的初中級讀者閱讀,可幫助這部分讀者深入學習與SQL優化相關的原理方法和技巧,為以後的工作和進一步提高打下良好的基礎。
本書既是一本不錯的學習資料,也可作為案頭必備的手冊,供讀者隨時翻閱。
內容簡介
SQL是*重要的關係數據庫操作語言。SQL語句的運行效率,對於數據庫的整體性能至關重要。因此,SQL語句的優化就成為數據庫專業人員必須掌握的一門技能。作為一個長期從事數據庫工作的技術人員,經常麵對很多初學者對如何入門、如何提高SQL語句優化能力的睏惑。本書規避瞭市麵上大多關於SQL優化的書籍講解內容過於深奧的問題,以一綫開發工程師的語言和視角展開,理論與實踐並重,不僅適閤初學者,也適閤中端技術人員進一步提高。
本書以大量案例為依托,係統講解瞭SQL語句優化的原理、方法及技術要點。本書尤為注重實踐,在章節中引入瞭大量的案例,便於學習者實踐、測試,反復揣摩。
全書分為三篇:
引言篇,總結瞭實際工作中常見的問題,並通過真實案例讓讀者直觀感受到SQL語句優化的重要。同時在每個案例後麵,還針對案例中齣現的問題進行瞭總結。
原理篇,主要講解瞭和SQL語句優化相關的基礎知識及必要的一些操作,包括瞭優化器、成本、執行計劃、統計信息、語句解析、遊標、綁定變量、數據對象等諸多方麵。
實戰篇,這是本書的重點,詳細講述瞭優化器對於SQL語句的多種處理方式,包括查詢轉換、數據對象訪問方式、錶關聯、半/反連接、子查詢、排序、並行等等。讀者瞭解瞭這些內容,可以更好地理解優化器的行為,從而使優化更加有的放矢。這部分實戰性極強,讀者可以作為案頭參考資料,隨時查閱,反復實踐。
另外,本書還提供瞭5個附錄,這部分對書中提到的案例編寫方式及相關知識點進行瞭詳細說明,目的是幫助讀者,尤其是初學者更好地進行實踐。
作者簡介
韓鋒,早年從事軟件開發工作,後因個人興趣轉入數據庫領域。有著多年的一綫數據庫架構、設計、開發經驗,曾擔任多傢公司首席DBA、數據庫架構師等職。現就職於宜信,曾就職於*當網、TOM在綫等公司。精通多種關係型數據庫,包括Oracle、MySQL、GreenPlum、Informix等,對NoSQL及大數據相關技術也很感興趣,實踐經驗豐富。
目錄
前言
第一篇引入篇
第0章引言
第1章與SQL優化相關的幾個案例
案例1-條SQL引發的血案
案例2糟糕的結構設計帶來的問題
案例3規範SQL寫法好處多
案例4“月底難過
案例5 COUNT(*)到底能有多快
案例6“抽絲剝繭”找齣問題所在
第二篇原理篇
第2章優化器與成本
2.1優化器
2.1.1基於規則的優化器
2.1.2基於成本的優化器
2.1.3對比兩種優化器
2.1.4優化器相關參數
優化器相關Hint
基本概念
計算公式
計算示例
第3章執行計劃
3.1概述
3.1.1什麼是執行計劃
3.1.2庫執行計劃存儲方式
3.2解讀執行計劃
3.2.1執行順序
3.2.2訪問路徑
3.3執行計劃操作
3.3.1查看執行計劃
3.3.2固定執行計劃
3.3.3修改執行計劃
第4章統計信息
4.1統計信息分類
4.1.1係統統計信息
4.1.2對象統計信息
4.1.3數據字典統計信息
4.1.4內部對象統計信息
?4.2統計信息操作
4.2.1係統統計信息
4.2.2對象統計信息
4.2.3數據字典統計信息
4.2.4內部對象統計信息
第5章SQL解析與遊標
5.1解析步驟
5.2解析過程
5.3遊標示例
第6章綁定變量
6.1使用方法
6.2綁定變量與解析
6.3遊標共享
第7章SQL優化相關對象
7.1錶
7.2字段
7.3索引
7.4視圖
7.5函數
7.6數據鏈(DB-LINK)
第8章SQL優化相關存儲結構
8.1錶空間
8.2段
8.3區
8.4塊
第9章特有SQL
9.1 MERGE-----
9.2 INSERT ALL
9.4 CONNECT BY/START WITH
第三篇實戰篇
第10章查詢轉換
10.1查詢轉換的分類及說明
10.2查詢轉換——子查詢類
10.3查詢轉換——視圖類
10.4查詢轉換——謂詞類
10.5查詢轉換——消除類
10.6查詢轉換——其他
第11章訪問路徑
11.1錶訪問路徑
11.1.1全錶掃描
11.1.2 ROWID掃描
11.1.3采樣掃描
11.2 B樹索引訪問路徑
1113位圖索引訪問路徑
11.4其他訪問路徑
第12章錶間關聯
12.1關聯關係
12.2錶關聯實現方法
12.3嵌套循環連接
12.4排序閤並連接
12.5哈希連接
12.6其他連接方式
第13章半連接與反連接
13.1半連接
?13.2反連接
第14章排序
14.1引發排序的操作
14.2避免和減少排序
14.2.1優化原則及基本方法
14.2.2避免排序的示例
14.3排序過程及內存使用
14.4執行計劃中的“Sort”
第15章子查詢
15.1處理方式
15.2子查詢分類
15.2.1按照語法分類
15.2.2按照謂詞分類
15.2.3示例
15.3子查詢優化
15.4子查詢特殊問題
15.4.1空值問題
15.4.2 0R問題
15.4.3 [NOT] IN/EXISTS問題
第16章並行
16.1並行操作
16.1.1並行查詢
16.1.2並行DML
16.1.3並行DDL
16.2並行級彆
16.3並行原理
16.3.1從屬進程
16.3.2粒度
附錄A常用技巧
附錄BSQL優化參數
附錄CSQL優化數據字典
附錄DSQL優化等待事件
附錄ESQL優化提示
前言/序言
為什麼要寫這本書我早年畢業後,曾長期從事ERP、電子政務類軟件的開發工作,作為一個數據庫的使用者,我接觸到瞭大量數據庫,如FoxPro、SQLServer、Oracle、Informix-----在不斷的使用過程中,我對這一領域越來越感興趣,並最終選擇瞭數據庫這條路。曾經長期擔任DBA、數據庫架構師等職,參與瞭大大小小很多項目的數據庫設計、開發、優化工作,並在這一過程中積纍瞭一些經驗。在多年的工作中,我發現數據庫領域存在一些現象。
現象一,開發人員將數據庫視為“黑盒子”。開發人員不關心、不重視,也不瞭解SQL語句的執行情況、數據庫的運行機理。甚至在很多O/RMapping工具的輔助下,連基本的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語句優化感興趣的人員;口大專院校計算機相關專業的學生。
如何閱讀本書本書分為四大部分:
第一部分為引入篇(第O~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工程師們!
韓鋒
SQL優化最佳實踐:構建高效率Oracle數據庫的方法與技巧 下載 mobi epub pdf txt 電子書