結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)是一種功能強大的數(shù)據(jù)庫語言。它基于關(guān)系代數(shù)運算,功能豐富、語言簡潔、使用方便靈活,已成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。
本書旨在引導(dǎo)讀者掌握SQL優(yōu)化技能,以更好地提升數(shù)據(jù)庫性能。本書共分10章,從SQL基礎(chǔ)知識、統(tǒng)計信息、執(zhí)行計劃、訪問路徑、表連接方式、成本計算、查詢變換、調(diào)優(yōu)技巧、經(jīng)典案例、全自動SQL審核等角度介紹了有關(guān)SQL優(yōu)化的方方面面。
本書基于Oracle進行編寫,內(nèi)容講解由淺入深,適合各個層次的讀者學(xué)習(xí)。本書面向一線工程師、運維工程師、數(shù)據(jù)庫管理員以及系統(tǒng)設(shè)計與開發(fā)人員,無論是初學(xué)者還是有一定基礎(chǔ)的讀者,都將從中獲益。
1.不管是數(shù)據(jù)庫開發(fā)人員、數(shù)據(jù)庫運維人員、DBA亦或是應(yīng)用程序開發(fā)人員、大數(shù)據(jù)開發(fā)人員等,SQL優(yōu)化現(xiàn)在已經(jīng)是這些從業(yè)者的專業(yè)技能。
2.SQL優(yōu)化跟做數(shù)學(xué)題一樣,沒有思路,一輩子都做不出來。本書既提供了SQL優(yōu)化核心思想,同時也包含了大量的SQL優(yōu)化案例,甚至還提供了全自動SQL審核的思想以及代碼。
3.本書的作者是業(yè)內(nèi)知名SQL優(yōu)化講師,自2012年開始,累計培訓(xùn)過數(shù)千名數(shù)據(jù)庫從業(yè)人員。
4.本書的絕大部分內(nèi)容源自作者自2012年以來開辦的“道森起點”高級SQL優(yōu)化班,高級SQL優(yōu)化班在網(wǎng)絡(luò)上是數(shù)據(jù)庫領(lǐng)域中很受歡迎的一門課程。
·大量經(jīng)典的案例,教你快速構(gòu)建SQL優(yōu)化解決方案。
·教你編寫SQL優(yōu)化全自動腳本,快速提升工作效率。
·每個知識點都提供了相應(yīng)的案例及源代碼,方便讀者動手實驗。
·嘆為觀止的優(yōu)化技巧,匪夷所思的優(yōu)化案例。
羅炳森
網(wǎng)名“落落”,2010年畢業(yè)于西南大學(xué)軟件工程專業(yè),2015年與他人聯(lián)合出版了《Oracle查詢優(yōu)化改寫技巧與案例》一書。先后在惠普、用友等大型公司擔(dān)任DBA、性能優(yōu)化工程師等崗位,長期致力于SQL優(yōu)化技術(shù)的研究和培訓(xùn),現(xiàn)階段開始涉及大數(shù)據(jù)、深度學(xué)習(xí)和人工智能等領(lǐng)域。
黃超
網(wǎng)名“道道”,2007年畢業(yè)于華中科技大學(xué)數(shù)學(xué)系,擅長SQL、PLSQL優(yōu)化技術(shù),擁有8年多的數(shù)據(jù)倉庫架構(gòu)管理經(jīng)驗,曾參與過大量移動通信、銀行、保險等行業(yè)的系統(tǒng)優(yōu)化升級工作。
鐘僥
網(wǎng)名“七年” ,2009年畢業(yè)于武漢理工大學(xué)軟件工程專業(yè),擁有8年的數(shù)據(jù)庫開發(fā)運維經(jīng)驗, 期間主要負責(zé)Oracle、MySQL的管理和優(yōu)化工作,熟悉數(shù)據(jù)倉庫體系以及大數(shù)據(jù)等領(lǐng)域。
第 1章 SQL優(yōu)化必懂概念 1
1.1 基數(shù)(CARDINALITY) 1
1.2 選擇性(SELECTIVITY) 3
1.3 直方圖(HISTOGRAM) 7
1.4 回表(TABLE ACCESS BY INDEXROWID) 13
1.5 集群因子(CLUSTERING FACTOR) 15
1.6 表與表之間關(guān)系 19
第 2章 統(tǒng)計信息 21
2.1 什么是統(tǒng)計信息 21
2.2 統(tǒng)計信息重要參數(shù)設(shè)置 24
2.3 檢查統(tǒng)計信息是否過期 32
2.4 擴展統(tǒng)計信息 37
2.5 動態(tài)采樣 42
2.6 定制統(tǒng)計信息收集策略 47
第3章 執(zhí)行計劃 49
3.1 獲取執(zhí)行計劃常用方法 49
3.1.1 使用AUTOTRACE查看執(zhí)行計劃 49
3.1.2 使用EXPLAIN PLAN FOR查看執(zhí)行計劃 52
3.1.3 查看帶有A-TIME的執(zhí)行計劃 54
3.1.4 查看正在執(zhí)行的SQL的執(zhí)行計劃 56
3.2 定制執(zhí)行計劃 57
3.3 怎么通過查看執(zhí)行計劃建立索引 59
3.4 運用光標(biāo)移動大法閱讀執(zhí)行計劃 63
第4章 訪問路徑(ACCESS PATH) 67
4.1 常見訪問路徑 67
4.1.1 TABLE ACCESS FULL 67
4.1.2 TABLE ACCESS BY USER ROWID 71
4.1.3 TABLE ACCESS BY ROWID RANGE 71
4.1.4 TABLE ACCESS BY INDEX ROWID 72
4.1.5 INDEX UNIQUE SCAN 72
4.1.6 INDEX RANGE SCAN 73
4.1.7 INDEX SKIP SCAN 74
4.1.8 INDEX FULL SCAN 75
4.1.9 INDEX FAST FULL SCAN 77
4.1.10 INDEX FULL SCAN (MIN/MAX) 80
4.1.11 MAT_VIEW REWRITE ACCESS FULL 83
4.2 單塊讀與多塊讀 83
4.3 為什么有時候索引掃描比全表掃描更慢 84
4.4 DML對于索引維護的影響 84
第5章 表連接方式 86
5.1 嵌套循環(huán)(NESTED LOOPS) 86
5.2 HASH連接(HASH JOIN) 90
5.3 排序合并連接(SORT MERGE JOIN) 93
5.4 笛卡兒連接(CARTESIAN JOIN) 95
5.5 標(biāo)量子查詢(SCALAR SUBQUERY) 98
5.6 半連接(SEMI JOIN) 100
5.6.1 半連接等價改寫 100
5.6.2 控制半連接執(zhí)行計劃 101
5.6.3 讀者思考 103
5.7 反連接(ANTI JOIN) 104
5.7.1 反連接等價改寫 104
5.7.2 控制反連接執(zhí)行計劃 105
5.7.3 讀者思考 108
5.8 FILTER 108
5.9 IN與EXISTS誰快誰慢 111
5.10 SQL語句的本質(zhì) 111
第6章 成本計算 112
6.1 優(yōu)化SQL需要看COST嗎 112
6.2 全表掃描成本計算 112
6.3 索引范圍掃描成本計算 116
6.4 SQL優(yōu)化核心思想 119
第7章 必須掌握的查詢變換 120
7.1 子查詢非嵌套 120
7.2 視圖合并 125
7.3 謂詞推入 129
第8章 調(diào)優(yōu)技巧 133
8.1 查看真實的基數(shù)(Rows) 133
8.2 使用UNION代替OR 134
8.3 分頁語句優(yōu)化思路 135
8.3.1 單表分頁優(yōu)化思路 135
8.3.2 多表關(guān)聯(lián)分頁優(yōu)化思路 150
8.4 使用分析函數(shù)優(yōu)化自連接 153
8.5 超大表與超小表關(guān)聯(lián)優(yōu)化方法 154
8.6 超大表與超大表關(guān)聯(lián)優(yōu)化方法 155
8.7 LIKE語句優(yōu)化方法 159
8.8 DBLINK優(yōu)化 161
8.9 對表進行ROWID切片 167
8.10 SQL三段分拆法 169
第9章 SQL優(yōu)化案例賞析 170
9.1 組合索引優(yōu)化案例 170
9.2 直方圖優(yōu)化案例 173
9.3 NL被驅(qū)動表不能走INDEX SKIP SCAN 177
9.4 優(yōu)化SQL需要注意表與表之間關(guān)系 178
9.5 INDEX FAST FULL SCAN優(yōu)化案例 179
9.6 分頁語句優(yōu)化案例 181
9.7 ORDER BY取別名列優(yōu)化案例 183
9.8 半連接反向驅(qū)動主表案例一 185
9.9 半連接反向驅(qū)動主表案例二 187
9.10 連接列數(shù)據(jù)分布不均衡導(dǎo)致性能問題 192
9.11 Filter優(yōu)化經(jīng)典案例 198
9.12 樹形查詢優(yōu)化案例 202
9.13 本地索引優(yōu)化案例 204
9.14 標(biāo)量子查詢優(yōu)化案例 206
9.14.1 案例一 206
9.14.2 案例二 207
9.15 關(guān)聯(lián)更新優(yōu)化案例 211
9.16 外連接有OR關(guān)聯(lián)條件只能走NL 213
9.17 把你腦袋當(dāng)CBO 217
9.18 擴展統(tǒng)計信息優(yōu)化案例 221
9.19 使用LISGAGG分析函數(shù)優(yōu)化WMSYS.WM_CONCAT 227
9.20 INSTR非等值關(guān)聯(lián)優(yōu)化案例 230
9.21 REGEXP_LIKE非等值關(guān)聯(lián)優(yōu)化案例 233
9.22 ROW LEVEL SECURITY優(yōu)化案例 237
9.23 子查詢非嵌套優(yōu)化案例一 240
9.24 子查詢非嵌套優(yōu)化案例二 247
9.25 爛用外連接導(dǎo)致無法謂詞推入 252
9.26 謂詞推入優(yōu)化案例 262
9.27 使用CARDINALITY優(yōu)化SQL 268
9.28 利用等待事件優(yōu)化SQL 272
第 10章 全自動SQL審核 281
10.1 抓出外鍵沒創(chuàng)建索引的表 281
10.2 抓出需要收集直方圖的列 282
10.3 抓出必須創(chuàng)建索引的列 283
10.4 抓出SELECT * 的SQL 284
10.5 抓出有標(biāo)量子查詢的SQL 285
10.6 抓出帶有自定義函數(shù)的SQL 286
10.7 抓出表被多次反復(fù)調(diào)用SQL 287
10.8 抓出走了FILTER的SQL 288
10.9 抓出返回行數(shù)較多的嵌套循環(huán)SQL 290
10.10 抓出NL被驅(qū)動表走了全表掃描的SQL 292
10.11 抓出走了TABLE ACCESS FULL的SQL 293
10.12 抓出走了INDEX FULL SCAN的SQL 294
10.13 抓出走了INDEX SKIP SCAN的SQL 295
10.14 抓出索引被哪些SQL引用 297
10.15 抓出走了笛卡兒積的SQL 298
10.16 抓出走了錯誤的排序合并連接的SQL 299
10.17 抓出LOOP套LOOP的PSQL 301
10.18 抓出走了低選擇性索引的SQL 302
10.19 抓出可以創(chuàng)建組合索引的SQL(回表再過濾選擇性高的列) 304
10.20 抓出可以創(chuàng)建組合索引的SQL(回表只訪問少數(shù)字段) 306