第1 章 LOB 段性能的诊断与调优 1
1.1 LOB 数据类型的介绍 1
1.1.1 解决LOB 问题:一个真实的案例 2
1.1.2 另一个真实案例:HW 分析 4
1.1.3 BASICFILE LOB :更完美的解决方案 7
1.2 BASICFILE 与SECUREFILE LOB 7
1.2.1 LOB 新旧类型的差异 8
1.2.2 迁移BASICFILE LOB 到SECUREFILE LOB 10
1.3 PCTFREE 对LOB 的影响 12
1.4 解决糟糕的INSERT 性能 15
1.5 总结 15
第2 章 处理undo 表空间损坏 16
2.1 undo 管理概述 16
2.1.1 UNDO_RETENTION 的重要性 16
2.1.2 优化UNDO_RETENTION 17
2.2 DTP、XA 和回滚段 18
2.3 undo 表空间损坏的恢复 20
2.3.1 预防、检测和修复损坏 20
2.3.2 处理内存损坏 21
2.3.3 处理逻辑损坏 24
2.3.4 解决介质损坏 24
2.4 总结 27
第3 章 处理全局缓存缓冲区忙等待事件 28
3.1 缓冲区忙等待事件概述 28
3.2 使用ORAchk 工具 29
3.2.1 安装ORAchk 29
3.2.2 ORAchk 执行结果:示例输出 30
3.3 查找GC 缓冲区忙等待事件 32
3.3.1 用ADDM 查找事件的信息 33
3.3.2 用AWR 查找等待事件的信息 33
3.3.3 用ASH 查找等待事件的信息 35
3.4 查找GC 缓冲区忙等待事件的原因 36
3.4.1 使用ASH 视图查找等待会话 36
3.4.2 快速查找性能瓶颈 38
3.5 解决GC 缓冲区忙等待 40
3.6 总结 41
第4 章 自适应游标共享 42
4.1 ACS 工作算法 42
4.1.1 绑定敏感与范围谓词 43
4.1.2 绑定敏感与等式谓词和直方图 45
4.1.3 绑定敏感与分区键 46
4.2 ACS 的使用 48
4.2.1 监控ACS 的绑定感知 51
4.2.2 BUCKET_ID 和COUNT 的关系 52
4.2.3 标记游标为绑定感知 55
4.3 游标绑定感知 61
4.4 一个真实案例 64
4.5 总结 69
第5 章 使用SPM 稳定查询响应时间 70
5.1 入门指南 70
5.2 创建SQL 计划基线 73
5.2.1 自动捕获计划 73
5.2.2 从游标缓存加载计划 76
5.3 伪造基线 77
5.4 Oracle 优化器和SPM 的交互 81
5.4.1 当CBO 计划与SQL 计划基线匹配时 82
5.4.2 当CBO 计划与SQL 计划基线不匹配时 84
5.4.3 当SQL 计划基线不可复制时 89
5.5 SQL 计划基线的复制性 93
5.5.1 重命名索引 93
5.5.2 修改索引类型 95
5.5.3 向索引中添加尾列 96
5.5.4 反向索引 97
5.6 NLS_SORT 与SQL 计划基线的复制性 98
5.7 ALL_ROWS 与FIRST_ROWS 100
5.8 自适应游标共享与SPM 104
5.8.1 Oracle 11.2.0.3.0 中的ACS 和SPM 105
5.8.2 Oracle 12.1.0.1.0 中的ACS 和SPM 109
5.9 总结 112
第6 章 DDL 优化技巧和技术 114
6.1 DDL 优化的概念 114
6.2 DDL 优化的机制 117
6.2.1 表基数估算 117
6.2.2 虚拟列中的C_DDL 列 119
6.2.3 列组扩展中的C_DDL 列 120
6.2.4 C_DDL 的默认值发生变化时 122
6.2.5 C_DDL 列和索引 124
6.2.6 空列的DDL 优化 126
6.3 总结 130
第7 章 管理、优化、调整大型数据库 131
7.1 大型数据库概述 131
7.2 优化基本配置 132
7.2.1 数据库仓库模板 132
7.2.2 优化数据块大小 133
7.2.3 大文件表空间 134
7.2.4 调整SGA 和PGA 135
7.2.5 临时表空间组 135
7.2.6 数据分区 136
7.2.7 本地分区索引和全局分区索引 136
7.2.8 数据压缩 137
7.2.9 表压缩 137
7.2.10 热图和自动数据优化 137
7.2.11 高级索引分区压缩 138
7.3 大型数据库性能调整的原则 139
7.3.1 真实的案例 139
7.3.2 控制索引对数据加载的影响 140
7.3.3 资源利用率的最大化 141
7.4 收集统计信息 142
7.4.1 增量统计信息摘要 142
7.4.2 并发收集统计信息 144
7.4.3 设置ESTIMATE_PERCENT 的值 145
7.5 备份与恢复的最佳实践 145
7.5.1 Exadata 解决方案 146
7.5.2 利用Data Guard 环境 147
7.6 总结 147
第8 章 RMAN 备份恢复最佳实践 148
8.1 完美的备份恢复计划 148
8.2 概述 149
8.3 数据库备份策略的技巧 149
8.3.1 完全备份和增量备份 150
8.3.2 压缩备份 150
8.3.3 增量备份 151
8.3.4 快速增量备份 151
8.3.5 Oracle 闪回技术之回退 152
8.3.6 基于磁盘的备份解决方案 153
8.3.7 增量更新的镜像副本 153
8.4 验证RMAN 备份 159
8.5 备份的优化与调整 160
8.6 RAC 集群下的RMAN 162
8.7 恢复目录 163
8.8 恢复策略 164
8.9 数据恢复顾问 165
8.10 总结 166
第9 章 使用AWR 分析优化数据库(一) 167
9.1 什么是AWR 167
9.2 知道要查找什么 168
9.3 报告头部信息 169
9.3.1 负载状况 171
9.3.2 实例效率 171
9.3.3 共享池内存 172
9.3.4 等待事件 172
9.3.5 平均负载 175
9.3.6 实例CPU 175
9.3.7 内存统计数据 176
9.4 RAC 特有的页面 176
9.4.1 RAC 统计数据 177
9.4.2 全局缓存负载统计数据 177
9.4.3 全局缓存和队列服务 177
9.4.4 集群互连 178
9.5 时间模型统计 179
9.6 操作系统统计数据 180
9.6.1 前台等待事件 181
9.6.2 后台等待事件 182
9.6.3 等待事件直方图 183
9.6.4 服务相关统计数据 184
9.7 SQL 章节 185
9.7.1 总运行时间 185
9.7.2 总CPU 时间 185
9.7.3 总缓冲区获取 186
9.7.4 总磁盘读 186
9.7.5 总执行次数 186
9.7.6 解析调用 186
9.7.7 可共享内存 187
9.7.8 版本数 187
9.7.9 集群等待时间 187
9.8 实例活动统计 188
9.8.1 一致性读统计数据 191
9.8.2 数据块读统计数据 191
9.8.3 脏块统计 191
9.8.4 队列统计 191
9.8.5 执行计数 191
9.8.6 空闲缓冲区统计 192
9.8.7 全局缓存统计 192
9.8.8 索引扫描统计数据 192
9.8.9 叶子节点统计数据 193
9.8.10 打开的游标 193
9.8.11 解析统计数据 193
9.8.12 物理读写统计数据 193
9.8.13 递归统计数据 195
9.8.14 重做相关的统计数据 195
9.8.15 会话游标统计数据 196
9.8.16 排序统计数据 196
9.8.17 脏队列长度汇总 196
9.8.18 表获取统计数据 197
9.8.19 事务回滚 197
9.8.20 撤销更改矢量统计 197
9.8.21 用户统计数据 198
9.8.22 工作区统计数据 198
9.8.23 实例活动统计--绝对值 198
9.8.24 实例活动统计--线程活动 199
9.9 总结 199
第10 章 使用AWR 分析优化数据库(二) 200
10.1 表空间I/O 统计数据 200
10.2 缓冲池 202
10.2.1 缓冲池统计数据 203
10.2.2 实例恢复统计数据 203
10.2.3 缓冲池建议部分 204
10.3 PGA 统计数据 204
10.3.1 PGA 汇总 206
10.3.2 PGA 总目标统计数据 206
10.3.3 PGA 总目标直方图 206
10.3.4 PGA 内存建议 208
10.4 共享池统计数据 208
10.5 其他建议 209
10.5.1 SGA 目标建议 210
10.5.2 流池建议 210
10.5.3 Java 池建议 211
10.6 缓冲区等待统计数据 211
10.7 队列统计数据 212
10.8 撤销段统计数据 214
10.9 闩锁统计数据 215
10.9.1 闩锁活动 216
10.9.2 闩锁休眠分类 217
10.9.3 闩锁和自旋数 217
10.9.4 闩锁丢失源 218
10.9.5 互斥锁休眠汇总 218
10.9.6 父类和子类闩锁 218
10.10 段访问区 218
10.11 库缓存活动部分 220
10.12 动态内存组件部分 223
10.13 进程内存部分 224
10.13.1 进程内存汇总 226
10.13.2 SGA 内存汇总 226
10.13.3 SGA 分类和差异 226
10.14 流组件部分 226
10.15 资源限制统计数据 228
10.16 初始化参数的改变 228
10.17 全局队列和其他RAC 部分 229
10.17.1 全局队列统计数据 233
10.17.2 全局CR 服务统计数据 233
10.17.3 全局当前服务统计数据 233
10.17.4 全局缓存传输统计数据 233
10.17.5 全局缓存传输时间 233
10.17.6 全局缓存传输 233
10.17.7 全局缓存时间 234
10.17.8 互连ping 延迟统计数据 234
10.17.9 客户端的互连吞吐量 234
10.17.10 互联设备统计数据 234
10.18 总结 234
第11 章 RAC 的故障诊断 236
11.1 RAC 的故障诊断和调优 236
11.1.1 ORAchk 工具 237
11.1.2 TFA 收集器 237
11.1.3 自动诊断库 237
11.1.4 告警和跟踪日志文件 237
11.2 运转良好的RAC 生态系统 239
11.2.1 最高可用性架构 239
11.2.2 优化和高效的RAC 数据库 240
11.2.3 基于OEM 12C 的RAC 故障诊断 241
11.2.4 故障诊断的程序和命令 242
11.3 总结 247
第12 章 利用SQL 顾问来分析和修复SQL 问题 248
12.1 OEM 12c :SQL 顾问首页 248
12.2 SQL 调优顾问 249
12.2.1 在OEM 12c 中运行SQL 调优顾问 250
12.2.2 在SQL*Plus 中手动运行SQL 调优顾问 253
12.3 SQL 访问顾问 253
12.3.1 在OEM 12c 中运行SQL 访问顾问 254
12.3.2 在SQL*Plus 中手动运行SQL 访问顾问 257
12.4 SQL 修复顾问 258
12.5 SQL 性能分析器 259
12.6 总结 260
第13 章 使用数据泵迁移数据和对象 261
13.1 使用数据泵 261
13.1.1 复制对象 262
13.1.2 数据泵模式 263
13.2 处理私有和公共对象 263
13.2.1 保存和恢复数据库链接 264
13.2.2 导出公共数据库链接和同义词 264
13.2.3 验证导出的转储文件内容 265
13.3 查找有效的INCLUDE 和EXCLUDE 值 265
13.4 导出数据子集 267
13.5 修改对象属性 269
13.5.1 将分区表导入为非分区表 269
13.5.2 将表分区导入为单独的表 269
13.5.3 屏蔽数据 270
13.5.4 重命名表或使用不同的表空间 270
13.5.5 使用默认存储参数 270
13.5.6 导入期间调整表空间大小 271
13.5.7 合并多个表空间 271
13.6 通过PL/SQL API 使用Data Pump 273
13.7 监控和修改资源 274
13.8 提升性能 275
13.9 升级数据库 276
13.10 总结 277
第14 章 数据库快速迁移数据的策略 278
14.1 为什么要迁移 278
14.2 确定最好的策略 279
14.2.1 实时与准实时迁移 279
14.2.2 接受只读 279
14.2.3 可逆性 280
14.3 考虑迁移什么数据 280
14.4 数据迁移的方法 281
14.4.1 事务性捕获迁移方法 281
14.4.2 非事务性迁移方法 283
14.4.3 其他迁移方法 295
14.5 总结 301
第15 章 临时文件I/O 问题的诊断和恢复 302
15.1 临时表空间概述 302
15.1.1 只读数据库 303
15.1.2 本地管理的临时表空间 303
15.1.3 临时表空间组 303
15.1.4 全局临时表 304
15.2 解决TEMPFILE I/O 等待 307
15.2.1 过小的PGA 307
15.2.2 不恰当的TEMPFILE 扩展区大小 311
15.2.3 不恰当地使用GTT 312
15.3 总结 312
第16 章 处理闩锁和互斥锁争用 313
16.1 闩锁和互斥锁架构概述 313
16.1.1 什么是闩锁 314
16.1.2 什么是互斥锁 315
16.1.3 闩锁和互斥锁的内部结构 315
16.2 检测闩锁和互斥锁争用 316
16.2.1 识别独特的闩锁 317
16.2.2 查找段和SQL 语句 318
16.3 闩锁和互斥锁场景 320
16.3.1 库缓存互斥锁等待 320
16.3.2 library cache pin 322
16.3.3 共享池闩锁 322
16.3.4 缓存缓冲区链闩锁 323
16.3.5 其他的闩锁场景 325
16.4 棘手的闩锁争用 326
16.5 总结 328
第17 章 使用SSD 解决I/O 瓶颈 329
17.1 磁盘技术:SSD 与 HDD 329
17.1.1 固态闪存盘的崛起 330
17.1.2 SSD 闪存的延迟 331
17.1.3 SSD 的经济性 332
17.1.4 SLC、MLC 和TLC 333
17.1.5 写性能与寿命 334
17.1.6 垃圾回收和磨损均衡 334
17.1.7 SATA 与 PCIe SSD 336
17.1.8 在Oracle 数据库中使用SSD 336
17.2 Oracle 数据库的闪存缓存 337
17.2.1 空闲缓冲区等待 337
17.2.2 配置和监控DBFC 339
17.2.3 使用FLASH_CACHE 子句 340
17.2.4 闪存缓存的性能统计数据 341
17.3 比较SSD 的部署选择 342
17.3.1 索引读 343
17.3.2 OLTP 上的读/ 写负载 344
17.3.3 全表扫描性能 344
17.3.4 SSD 本地缓存和全表扫描 345
17.3.5 磁盘排序和散列操作 346
17.3.6 重做日志的优化 349
17.4 存储分层 349
17.5 闪存和Exadata 353
17.6 总结 357
第18 章 为最佳性能设计和监控索引 359
18.1 索引的类型 359
18.1.1 B 树索引 359
18.1.2 位图索引 362
18.1.3 分区索引 364
18.1.4 其他索引类型 366
18.2 同一列上的多个索引 368
18.3 索引的性能问题 369
18.3.1 索引统计信息 369
18.3.2 高集群因子的影响 372
18.3.3 索引操作的注意事项 373
18.3.4 隐藏非选择的索引 374
18.3.5 RAC 数据库中的索引性能问题 375
18.4 总结 377
第19 章 使用SQLT 提升查询性能 379
19.1 安装SQLT 379
19.2 使用XTRACT 方法 380
19.3 使用XECUTE 方法 381
19.4 其他SQLT 方法 384
19.5 一个真实的案例 385
19.6 总结 386
第20 章 处理XA 分布式事务的问题 387
20.1 修复常见的分布式事务问题 387
20.2 修复幽灵分布式事务 388
20.2.1 信息存在,但事务不在 389
20.2.2 ORA-1591 没有对应的信息 389
20.2.3 提交或回滚之后事务挂起 391
20.3 监控分布式事务 393
20.4 总结 395