SQL优化核心思想
出版时间: 2018
结构化查询语言(Structured Query Language,SQL)是一种功能强大的数据库语言。它基于关系代数运算,功能丰富、语言简洁、使用方便灵活,已成为关系数据库的标准语言。本书旨在引导读者掌握SQL优化技能,以更好地提升数据库性能。本书共分10章,从SQL基础知识、统计信息、执行计划、访问路径、表连接方式、成本计算、查询变换、调优技巧、经典案例、全自动SQL审核等角度介绍了有关SQL优化的方方面面。本书基于Oracle进行编写,内容讲解由浅入深,适合各个层次的读者学习。本书面向一线工程师、运维工程师、数据库管理员以及系统设计与开发人员,无论是初学者还是有一定基础的读者,都将从中获益。
目录
- 第 1章SQL优化必懂概念 1
- 1.1基数(CARDINALITY) 1
- 1.2选择性(SELECTIVITY) 3
- 1.3直方图(HISTOGRAM) 7
- 1.4回表(TABLE ACCESS BY INDEXROWID) 13
- 1.5集群因子(CLUSTERING FACTOR) 15
- 1.6表与表之间关系 19
- 第 2章统计信息 21
- 2.1什么是统计信息 21
- 2.2统计信息重要参数设置 24
- 2.3检查统计信息是否过期 32
- 2.4扩展统计信息 37
- 2.5动态采样 42
- 2.6定制统计信息收集策略 47
- 第3章执行计划 49
- 3.1获取执行计划常用方法 49
- 3.1.1使用AUTOTRACE查看执行计划 49
- 3.1.2使用EXPLAIN PLAN FOR查看执行计划 52
- 3.1.3查看带有A-TIME的执行计划 54
- 3.1.4查看正在执行的SQL的执行计划 56
- 3.2定制执行计划 57
- 3.3怎么通过查看执行计划建立索引 59
- 3.4运用光标移动大法阅读执行计划 63
- 第4章访问路径(ACCESS PATH) 67
- 4.1常见访问路径 67
- 4.1.1TABLE ACCESS FULL 67
- 4.1.2TABLE ACCESS BY USER ROWID 71
- 4.1.3TABLE ACCESS BY ROWID RANGE 71
- 4.1.4TABLE ACCESS BY INDEX ROWID 72
- 4.1.5INDEX UNIQUE SCAN 72
- 4.1.6INDEX RANGE SCAN 73
- 4.1.7INDEX SKIP SCAN 74
- 4.1.8INDEX FULL SCAN 75
- 4.1.9INDEX FAST FULL SCAN 77
- 4.1.10INDEX FULL SCAN (MIN/MAX) 80
- 4.1.11MAT_VIEW REWRITE ACCESS FULL 83
- 4.2单块读与多块读 83
- 4.3为什么有时候索引扫描比全表扫描更慢 84
- 4.4DML对于索引维护的影响 84
- 第5章表连接方式 86
- 5.1嵌套循环(NESTED LOOPS) 86
- 5.2HASH连接(HASH JOIN) 90
- 5.3排序合并连接(SORT MERGE JOIN) 93
- 5.4笛卡儿连接(CARTESIAN JOIN) 95
- 5.5标量子查询(SCALAR SUBQUERY) 98
- 5.6半连接(SEMI JOIN) 100
- 5.6.1半连接等价改写 100
- 5.6.2控制半连接执行计划 101
- 5.6.3读者思考 103
- 5.7反连接(ANTI JOIN) 104
- 5.7.1反连接等价改写 104
- 5.7.2控制反连接执行计划 105
- 5.7.3读者思考 108
- 5.8FILTER 108
- 5.9IN与EXISTS谁快谁慢 111
- 5.10SQL语句的本质 111
- 第6章成本计算 112
- 6.1优化SQL需要看COST吗 112
- 6.2全表扫描成本计算 112
- 6.3索引范围扫描成本计算 116
- 6.4SQL优化核心思想 119
- 第7章必须掌握的查询变换 120
- 7.1子查询非嵌套 120
- 7.2视图合并 125
- 7.3谓词推入 129
- 第8章调优技巧 133
- 8.1查看真实的基数(Rows) 133
- 8.2使用UNION代替OR 134
- 8.3分页语句优化思路 135
- 8.3.1单表分页优化思路 135
- 8.3.2多表关联分页优化思路 150
- 8.4使用分析函数优化自连接 153
- 8.5超大表与超小表关联优化方法 154
- 8.6超大表与超大表关联优化方法 155
- 8.7LIKE语句优化方法 159
- 8.8DBLINK优化 161
- 8.9对表进行ROWID切片 167
- 8.10SQL三段分拆法 169
- 第9章SQL优化案例赏析 170
- 9.1组合索引优化案例 170
- 9.2直方图优化案例 173
- 9.3NL被驱动表不能走INDEX SKIP SCAN 177
- 9.4优化SQL需要注意表与表之间关系 178
- 9.5INDEX FAST FULL SCAN优化案例 179
- 9.6分页语句优化案例 181
- 9.7ORDER BY取别名列优化案例 183
- 9.8半连接反向驱动主表案例一 185
- 9.9半连接反向驱动主表案例二 187
- 9.10连接列数据分布不均衡导致性能问题 192
- 9.11Filter优化经典案例 198
- 9.12树形查询优化案例 202
- 9.13本地索引优化案例 204
- 9.14标量子查询优化案例 206
- 9.14.1案例一 206
- 9.14.2案例二 207
- 9.15关联更新优化案例 211
- 9.16外连接有OR关联条件只能走NL 213
- 9.17把你脑袋当CBO 217
- 9.18扩展统计信息优化案例 221
- 9.19使用LISGAGG分析函数优化WMSYS.WM_CONCAT 227
- 9.20INSTR非等值关联优化案例 230
- 9.21REGEXP_LIKE非等值关联优化案例 233
- 9.22ROW LEVEL SECURITY优化案例 237
- 9.23子查询非嵌套优化案例一 240
- 9.24子查询非嵌套优化案例二 247
- 9.25烂用外连接导致无法谓词推入 252
- 9.26谓词推入优化案例 262
- 9.27使用CARDINALITY优化SQL 268
- 9.28利用等待事件优化SQL 272
- 第 10章全自动SQL审核 281
- 10.1抓出外键没创建索引的表 281
- 10.2抓出需要收集直方图的列 282
- 10.3抓出必须创建索引的列 283
- 10.4抓出SELECT * 的SQL 284
- 10.5抓出有标量子查询的SQL 285
- 10.6抓出带有自定义函数的SQL 286
- 10.7抓出表被多次反复调用SQL 287
- 10.8抓出走了FILTER的SQL 288
- 10.9抓出返回行数较多的嵌套循环SQL 290
- 10.10抓出NL被驱动表走了全表扫描的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抓出可以创建组合索引的SQL(回表再过滤选择性高的列) 304
-
10.20抓出可以创建组合索引的SQL(回表只访问少数字段) 306