內容簡介
有人就有江湖,有江湖就有IT系統,有IT系統就有資料庫,有資料庫就有SQL,SQL套用可一字概括:“廣”。加之其簡單易學,SQL實現也可一字概括:“樂”。然而,SQL雖然實現簡單可樂,卻極易引發性能問題,此時廣大SQL使用人員可要“愁”就一個字,心碎無數次了。 緣何有性能問題?原因也一字概括:“量”。當系統數據量、並發訪問量上去後,不良SQL就會拖跨了整個系統,我們甚至找不出哪些SQL影響了系統。即便找到也不知如何動手最佳化。此時的心情也可以一字概括:“懵”。現在本書開始帶你拋除煩惱,走進最佳化的可樂世界了!首先教你SQL整體最佳化、快速最佳化實施、如何讀懂執行計畫、如何左右執行計畫這四大必殺招。整這些幹嘛呢?答案是,傳授一個先整體後局部的巨觀解決思路,走進“道”的世界。接下來帶領大家飛翔在“術”天空。教你體系結構、邏輯結構、表設計、索引設計、表連線這五大要領。這么多套路,這又是要幹嘛?別急,這是教你如何解決問題,準確的說,是如何不改寫即完成SQL最佳化。隨後本書指引大家學會等價改寫、過程包最佳化、高級SQL、分析函式、需求最佳化這些相關的五大神功。有點頭暈,能否少一點套路?淡定,這還是“術”的範疇,依然是教你如何解決問題,只不過這次是如何改寫SQL完成最佳化。最後一個章節沒套路了,其中跟隨你多年的錯誤認識是否讓你懷疑人生,其中讓SQL跑的更慢的觀點,是否讓你三觀盡毀?再多一點真誠吧,本書提供掃二維碼輔助學習,是不是心被筆者給暖到了。讀完全書,來,合上書本,閉上眼睛,深呼吸,用心來感受SQL最佳化的世界。一個字:“爽”!
圖書目錄
第1章 全局在胸——用工具對SQL整體最佳化 1
1.1 都有哪些性能工具 1
1.1.1 不同調優場景分析 2
1.1.2 不同場景對應工具 2
1.2 整體性能工具的要點 4
1.2.1 五大性能報表的獲取 5
1.2.2 五大報表關注的要點 10
1.3 案例的分享與交流 18
1.3.1 和並行等待有關的案例 18
1.3.2 和熱塊競爭有關的案例 19
1.3.3 和日誌等待有關的案例 20
1.3.4 新疆某系統的前台最佳化 20
1.3.5 浙江某系統的調優案例 21
1.4 本章總結延伸與習題 21
1.4.1 總結延伸 21
1.4.2 習題訓練 23
第2章 風馳電掣——有效縮短SQL最佳化過程 24
2.1 SQL調優時間都去哪兒了 25
2.1.1 不善於批處理頻頻忙互動 25
2.1.2 無法抓住主要矛盾瞎折騰 25
2.1.3 未能明確需求目標白費勁 26
2.1.4 沒有分析操作難度亂調優 26
11.2.3 表連線是否有排序 311
11.2.4 各連線的使用限制 314
11.2.5 三大表連線的特性總結 317
11.3 從案例學表連線最佳化要點 (三刀三斧四式走天下) 317
11.3.1 一次Nested Loops Join的最佳化全過程 318
11.3.2 一次Hash Join 的 最佳化全過程 320
11.3.3 一次 Merge Sort Join 的最佳化全過程 324
11.3.4 一次統計信息收集不準確引發的NL性能瓶頸 329
11.4 本章習題、總結與延伸 332
第12章 動手,經典等價改寫讓SQL飛 333
12.1 設法減少訪問路徑 333
12.1.1 Case When改造 334
12.1.2 Rownum分頁改寫 337
12.1.3 Hint直接路徑改造 338
12.1.4 只取你所需的列 339
12.1.5 避免或者減少遞歸調用 341
12.1.6 ROWID最佳化套用 347
12.2 設法避免外因影響 350
12.2.1 Hint改寫確保執行計畫正確 350
12.2.2 避免子查詢的錯誤執行計畫 350
12.2.3 所在環境的資源不足等問題 351
12.3 本章習題、總結與延伸 351
第13章 動手,過程函式最佳化讓SQL飛 352
13.1 PL/SQL最佳化重點 353
13.1.1 定義類型的最佳化 353
13.1.2 PL/SQL的集合最佳化 355
13.1.3 PL/SQL的游標合併 361
13.1.4 動態SQL 364
13.1.5 使用10046trace 跟蹤PL/SQL 368
13.2 PL/SQL最佳化其他相關擴展 369
13.2.1 編譯無法成功 369
13.2.2 通用腳本分享 370
13.3 本章習題、總結與延伸 380
第14章 動手,高級寫法套用讓SQL飛 381
14.1 具體SQL調優思路 381
14.1.1 改寫SQL調優 382
14.1.2 不改寫SQL調優 382
14.2 高級SQL介紹與案例 383
14.2.1 GOURP BY的擴展 383
14.2.2 INSERT ALL 389
14.2.3 MERGE 392
14.2.4 WITH子句 402
14.3 本章習題、總結與延伸 404
第15章 動手,分析函式讓SQL飛 406
15.1 高級SQL之分析函式 407
15.1.1 語法概述 407
15.1.2 特別之處 407
15.2 分析函式詳解與案例 409
15.2.1 學習詳解 410
15.2.2 案例分享 417
15.3 本章習題、總結與延伸 432
第16章 動手,把握需求改寫讓SQL飛 433
16.1 考慮需求最小化 434
16.2 千萬弄清SQL改造的等價性 434
16.2.1 看似等價的寫法,其實不等價 435
16.2.2 看似不等價的寫法,其實等價 438
16.3 開發設計套用中的需求 439
16.3.1 界面許可權設計最佳化 439
16.3.2 界面匯總與展現 439
16.3.3 界面實時刷新改良 439
16.3.4 目錄樹選單的最佳化 440
16.4 場景選擇的經典案例之誰是Count(*)之王 440
16.4.1 最佳化過程 440
16.4.2 最佳化總結 445
16.5 本章習題、總結與延伸 446
第17章 總結與延伸:從勿信訛傳到洞若觀火 447
17.1 SQL最佳化的各個誤區 447
17.1.1 COUNT(*)與COUNT(列)的傳言 447
17.1.2 談SQL編寫順序之流言蜚語 451
17.1.3 IN與EXISTS之爭 455
17.1.4 總結探討 457
17.2 誤區背後的話題擴展 457
17.2.1 話題擴展之等價與否優先 457
17.2.2 話題擴展之顛覆誤區觀點 458
17.3 全書完,致讀者 461