第1章 Oracle9i——Oracle9i新特性介绍(针对DBA和开发人员) 1
目 录 1
1.1 新的Oracle9i管理特性 2
1.1.1迁移注意事项 2
1.1.2不支持SVRMGRL和Connect Internal 3
1.1.3 DBCA和SYS账户安全性的增强 3
1.1.4服务器参数文件 3
1.1.5 Automatic Undo Management 4
1.1.6可恢复的空间分配 4
1.1.8 Oracle托管的文件 5
1.1.7默认的临时表空间 5
1.1.9动态内存管理 6
1.1.10支持多种数据库块大小 7
1.1.11 游标共享 8
1.1.12自调整的PGA 8
1.1.13联机重定义表 8
1.1.14其他管理特性 8
1.2新的Oracle9i体系结构特性 9
1.2.1新的分区选项和特性 9
1.2.3段空间自动管理 10
14.3.2 更新STATSPACK 5 10
1.2.2对象元数据的提取 10
1.2.4新的索引特性 11
1.3 新的Oracle9i数据仓库特性 12
1.3.1 外部表 12
1.3.2视图约束 12
1.3.3 多表INSERT语句 13
1.4.2 Oracle的CASE语句和表达式 14
1.4 新的Oracle9i SQL和PL/SQL特性 14
1.4.1 关联数组 14
1.4.3 Oracle的MERGE语句 15
1.4.4对ANSI/ISOSQL1999规范的支持 16
1.4.5其他的SQL和PL/SQL特性 16
1.5新的Oracle9i备份和恢复特性 18
1.5.1 快速启动故障恢复(基于时间) 18
1.5.2闪回查询 18
1.5.3 新的RMAN特性 19
1.6.1并行数据库 20
1.5.4新的Log Miner特性 20
1.6 实时应用群集(Real Application Clusters,RAC) 20
1.5.5 Oracle9i Data Guard 20
1.6.2 Oracle的RAC体系结构 21
1.6.3 Oracle RAC系统的内部运行机制 23
1.6.4 SCN处理 25
1.6.5小结 26
1.7技巧回顾 26
第2章基本的索引原理(针对DBA和初级开发人员) 28
2.1基本的索引概念 28
2.2 组合索引 30
2.3 Oracle ROWID 31
2.4 限制索引 32
2.4.1 使用不等于操作符(?、!=) 32
2.4.2使用IS NULL或IS NOT NULL 32
10.10 使用和修改DBMS SHARED POO L.SIZES 34
2.4.3使用函数 34
2.4.4 比较不匹配的数据类型 34
2.5 选择性 35
2.6 群集因子(Clustering Factor) 35
2.7二元高度(binary height) 36
2.8使用柱状图 37
2.9快速全局扫描 38
2.10跳跃式扫描 39
2.11索引的类型 40
2.11.2位图索引 41
2.11.1 B-树索引 41
2.11.3 HASH索引 43
2.11.4索引编排表 44
2.11.5反转键索引 45
2.11.6基于函数的索引 45
2.11.7分区索引 47
2.13 技巧回顾 49
2.12快速重建索引 49
第3章 磁盘I/O和碎片(针对DBA) 52
3.1使用磁盘阵列 52
3.1.1 可用的RAID级别 53
3.1.2简化安装和维护 53
3.1.3磁盘阵列是否一直可用 54
3.2在可用的磁盘之间分布关键数据文件 54
3.1.4考虑代价 54
3.2.1分开存储数据和索引文件 55
3.2.2避免I/O磁盘争用 56
3.2.3通过移动数据文件来均衡文件I/O 57
3.3使用本地托管的表空间 58
3.3.1创建本地托管的表空间 58
3.3.2把字典托管的表空间迁移到本地托管的表空间 59
3.3.3使用Enterprise Manager查看文件/表空间的信息 60
3.4使用分区来避免磁盘争用 61
3.4.1 获得关于分区的更多信息 63
3.4.2其他类型的分区 64
3.4.3其他分区选项 67
3.5使用索引分区 69
3.6导出分区 70
3.7 消除碎片 71
3.7.2创建一个新表空间并把数据移到其中 72
3.7.1 使用正确的扩展大小 72
3.7.3导出和重新导入表 74
3.7.4正确设定比例以避免链化现象 75
3.7.5重建数据库 75
3.8使用撤消管理 77
3.8.1确定重做日志文件的大小是否存在问题 78
3.8.2确定日志文件的大小和检查点的时间间隔 79
3.8.3增加恢复的可能:在每次批处理后提交 81
3.9使用回滚段 81
3.9.1避免回滚段之间的争用 81
3.9.2监控回滚段的等待和争用 81
3.9.3增加回滚段 82
3.9.4把大的事务隔离到它们自己的回滚段上 82
3.10 更简便的方法:UNDO表空间 83
3.11 结束有问题的会话 84
3.12通过内存排序来减少磁盘I/O 86
3.13在不同磁盘和控制器上存放多个控制文件 87
3.14对写操作频繁的数据使用裸设备来提高I/O 87
3.14.1使用裸设备的好处 87
3.15磁盘I/O的其他注意事项和提示 88
3.16设计阶段需要注意的问题 88
3.14.2使用裸设备的缺点 88
3.17技巧回顾 89
4.1重要的init.ora参数 91
第4章用初始化参数调整数据库(针对DBA) 91
4.2不用重启就修改init.ora文件 92
4.3 用Enterprise Manager查看init.ora参数 93
4.4 调整DB_CACHE_SIZE来提高性能 94
4.4.1 在调整DB_CACHE_SIZE时使用V$DB_CACHE_ADVICE 96
4.4.2保证数据缓存命中率超过95% 97
4.4.3 监控V$SQLAREA视图以查找较慢的查询 97
4.5 设定DB_BLOCK_SIZE来优化数据读取量的大小 100
4.5.1调整SHARED_POOL_SIZE以优化性能 101
4.5.2使用Oracle的多个缓冲池 110
4.5.3 调整PGA_AGGREGATE_TARGET以优化对内存的应用 112
4.5.4修改SGA大小以避免分页和交换 113
4.5.5 了解OPTIMIZER_MODE:基于代价和基于规则的优化 114
4.5.6创建足够的调度程序 115
4.5.7 25个重要的初始化参数 116
4.5.8未记录入档的init.ora参数 117
4.5.9 了解典型的服务器 118
4.5.10典型的服务器模式 118
4.6技巧回顾 119
第5章Enterprise Manager和调整包(针对DBA和开发人员) 122
5.1 Enterprise Manager控制台 123
5.2 Instance文件夹 123
5.2.1实例管理——状态窗口 123
5.2.2实例管理——启动选项 123
5.2.3实例管理——初始化参数 124
5.2.4实例管理——检查单个会话 125
5.2.5实例管理——Memory Advisor 125
5.3 Schema文件夹 126
5.3.1模式管理——检查特定的表 126
5.3.2模式管理——检查特定的索引 127
5.3.3 模式管理——检查SYS信息 128
5.4 Security文件夹 129
5.3.4模式管理——检查包、过程和触发器 129
5.5 Storage文件夹 132
5.6 Oracle SQL Scratchpad和SQL*PLUS表 132
5.7 Performance Manager 133
5.7.1 Performance Manager——Database Health Overview图表 134
5.7.2 Performance Manager——缓冲区缓存命中率 135
5.7.3 PerformanceManager——库缓存命中率 136
5.7.4 Performance Manager——数据字典缓存命中率 137
5.7.5 Performance Manager——SQL区域 137
5.7.6 Performance Manager——内存排序命中率 138
5.7.7 Performance Manager——系统I/O率 138
5.7.8 Performance Manager——数据库实例信息 139
5.7.9 Performance Manager——构建自定义的图表 140
5.7.10 Performance Manager——Top图表和会话 142
5.8 Oracle调整包——SQL Analyze 144
5.8.1 SQLAnalyze——EXPLAIN PLAN 145
5.8.2 SQLAnalyze——执行统计 146
5.8.3 SQLAnalyze——比较不同的计划 147
5.8.4 SQLAnalyze——调整向导 148
5.9索引调整向导 149
5.10 Oracle调整包——Oracle Expert 150
5.10.1 Oracle Expert——模式调整 150
5.10.2 Oracle Expert——为调整会话设定规则 151
5.10.4 Oracle Expert——检查建议 152
5.10.3 OracleExpert——进行修改并测试影响 152
5.10.5 Oracle Expert——了解建议的细节 153
5.10.6 Oracle Expert——所建议的系统范围内的修改 154
5.11 Oracle调整包——表空间映射 154
5.12 Oracle Expert分析报告 155
5.13商务影响报告 155
5.13.1服务级别的报告 156
5.13.2应用程序运行状况评估 156
5.14技巧回顾 158
第6章实用工具简介(针对DBA和开发人员) 160
6.1 Oracle的TRACE实用程序 160
6.1.1 对简单查询使用TRACE的简单步骤 161
6.1.2 TRACE输出部分 165
6.1.3更复杂的TKPROF输出 167
6.1.4深入探讨TKPROF输出 168
6.1.5 单独使用EXPLAIN PLAN 170
6.1.6 EXPLAIN PLAN——从上至下读取和从下至上读取 173
6.1.7阅读EXPLAIN PLAN 174
6.1.8 另一种EXPLAIN PLAN输出方法:构建树结构 178
6.1.9另一个使用树的例子 180
6.1.10在开发产品中利用TRACE/EXPLAIN发现有问题的查询 182
6.1.11 PLAN_TABLE表中的重要列 182
6.1.12 Oracle支持的一些有用的程序包 184
6.1.13适用于未记录入档的TRACE操作的INIT.ORA参数 185
6.1.14使用Stored Outline 186
6.2技巧回顾 193
第7章 基本的提示句法(针对DBA和开发人员) 195
7.1 最常用的提示 196
7.1.1谨慎使用提示 196
7.1.2首先修正设计方案 197
7.2可用的提示和分组 197
7.2.1 改变执行路径 197
7.2.2使用访问方法提示 197
7.2.3使用查询转换提示 198
7.2.4使用连接操作提示 198
7.2.5使用并行执行 198
7.2.6其他提示 198
7.4指定多个提示 199
7.3 指定提示 199
7.5使用别名 200
7.6使用提示 200
7.6.2使用RULE提示 201
7.6.1使用CHOOSE提示 201
7.6.3使用FIRST_ROWS提示 202
7.6.4 使用ALL_ROWS提示 203
7.6.5使用FULL提示 203
7.6.6使用INDEX提示 204
7.6.7使用NO_INDEX提示 205
7.6.8使用INDEX_JOIN提示 206
7.6.9使用AND_EQUAL提示 206
7.6.10使用INDEX_COMBINE提示 207
7.6.11使用INDEX_ASC提示 207
7.6.12使用INDEX_DESC提示 208
7.6.13使用INDEX_FFS提示 208
7.6.14使用ORDERED提示 209
7.6.15使用LEADING提示 210
7.6.16使用ORDERED_PREDICATES提示 210
7.6.17使用ROWID提示 211
7.6.19使用DRIVING_SITE提示 212
7.6.18使用NO_EXPAND提示 212
7.6.20使用USE_MERGE提示 213
7.6.21 使用USE_NL提示 214
7.6.22使用USE_HASH提示 215
7.6.23使用PUSH_SUBQ提示 215
7.6.24使用PARALLEL提示 216
7.6.25使用NOPARALLEL提示 217
7.6.26使用APPEND提示 217
7.6.27使用NOAPPEND提示 218
7.6.28使用CACHE提示 218
7.6.29使用NOCACHE提示 219
7.6.30 使用CLUSTER提示 219
7.6.31 使用HASH提示 220
7.6.32 使用CURSOR_SHARING_EXACT提示 220
7.8提示一览表 221
7.7使用提示可能遇到的问题 221
7.9技巧回顾 222
第8章 调整查询(针对初级DBA和开发人员) 225
8.1.1 在V$SQLAREA视图中选出最占用资源的查询 226
8.1.2在V$SQL视图中选出最占用资源的查询 226
8.1 查询V$SQLAREA和V$SQL 226
8.2确定何时使用索引 227
8.3遗忘索引 228
8.4创建索引 229
8.5查看表上的索引 229
8.6正确当地建立索引 230
8.7修正差的索引 231
8.8 在SELECT和WHERE中使用索引 232
8.10使查询魔术般加速 234
8.9使用快速全局扫描 234
8.11 在内存中缓存表 235
8.12使用多个索引(利用最佳选择性) 237
8.13使用索引合并 238
8.14处理受限制的索引 239
8.15使用基于函数的索引 241
8.16了解“古怪”的OR 241
8.17使用EXISTS函数 243
8.18技巧回顾 244
第9章表的连接和其他高级调整技术 246
9.1 连接方法 247
9.1.1嵌套循环连接 247
9.1.2排序合并连接 248
9.1.3群集连接 249
9.1.4哈希连接 249
9.1.5索引连接 250
9.2表连接的初始化参数 253
9.2.1排序合并连接参数 253
9.2.2哈希连接参数 253
9.3 比较主要的连接方法 253
9.4双表连接:等尺寸表(基于代价) 254
9.5双表索引连接:等尺寸表(基于代价) 257
9.6强制执行特殊的连接方法 259
9.7在多表连接中除去连接记录(侯选行) 262
9.8在大小不同的表间进行双表连接 263
9.9三表连接 266
9.10位图连接索引 269
9.11 第三方性能调整工具 274
9.12调整分布式查询 279
9.13一切就绪 281
9.14各种调整技术摘要 281
9.14.1实时应用群集(Real Application Clusters,RAC) 282
9.14.2 RedHat炙手可热:Linux造成的改变 283
9.14.3 外部表 284
9.14.4数据快照太旧:开发人员的编程难题 288
9.14.5设置事件以转储每次等待 289
9.14.6数据块转储:最后的建议(仅针对最高级的DBA) 290
9.15.1传统的数学分析 292
9.15使用简单的数学方法调整性能 292
9.15.2方法论的七个步骤 293
9.15.3模式分析 298
9.15.4数学方法总结 303
9.16更多的数学方法:应用控制理论 303
9.17技巧回顾 311
第10章 使用PL/SQL提高性能(针对DBA和开发人员) 313
10.1 使用DBMS APPLICATION INFO进行实时监控 314
10.2在数据库的表中记录计时信息 316
10.3 减少PL/SQL程序的单元迭代和迭代的时间 319
10.4 使用ROWID进行迭代处理 322
10.5 将数据类型、IF语句的排列和PLS INTEGER标准化 323
10.5.1确保比较运算中的数据类型相同 324
10.5.3 使用PLS_INTEGER PL/SQL数据类型进行整数运算 326
10.5.2根据条件出现的频率来排序IF条件 326
10.6 减少对SYSDATE的调用 328
10.7 减少MOD函数的使用 329
10.8在共享池中固定对象 331
10.8.1 将PL/SQL对象语句固定(缓存)到内存中 332
10.8.2固定所有的包 333
10.9标识需要固定的PL/SQL对象 333
10.11 从DBA OBJECT SIZE中获取详细的对象信息 336
10.12发现无效的对象 337
10.13 发现已禁用的触发器 338
10.14将PL/SQL表用于快速参考表查询 340
10.15 查找和调整所使用对象的SQL 342
10.16在处理DATE数据类型时使用时间信息 346
10.17 调整和测试PL/SQL 348
10.18 了解PL/SQL对象定位的含义 349
10.19使用回滚段打开大型游标 350
10.20使用数据库的临时表来提高性能 352
10.21集成用户跟踪机制以定位执行位置 352
10.22 限制动态SQL的使用 353
10.23 为初学者提供的例子 353
10.23.1创建PL/SQL代码 354
10.23.2创建过程 354
10.23.3执行PL/SQL过程 355
10.23.4创建函数 355
10.23.5 在SQL中执行GET_CUST_NAME函数 355
10.23.6创建数据包 355
10.23.7在数据库触发器中使用PL/SQL 356
10.24技巧回顾 356
第11章使用并行特性提高性能(针对DBA) 358
11.1 并行操作的基本概念 358
11.2 并行DML和DDL语句和操作 360
11.3 Oracle 9i的并行DML语句和操作 360
11.4并行处理和分区 361
11.5操作内部和操作之间的并行处理 361
11.6使用并行操作生成表和索引的示例 364
11.7并行DML语句和示例 366
11.7.1 并行DML的约束条件 366
11.7.2并行DML语句示例 367
11.8通过V$视图监控并行操作 368
11.8.1 V$PQ_TQSTAT 369
11.8.2 V$PQSYSSTAT 369
11.8.3 V$PQ_SESSTAT 372
11.9 在并行操作时使用EXPLAIN PLAN和AUTOTRACE 373
11.10调整并行执行和Oracle 9i初始化参数 377
11.11并行加载 381
11.12性能比较和监控并行操作 382
11.13使用并行处理时的其他注意事项 385
11.14技巧回顾 385
第12章V$视图(针对DBA和开发人员) 387
12.1 V$视图的创建和访问 388
12.1.1 获得所有V$视图的数量和列表 390
12.1.2查找用于创建V$视图的X$表 391
12.1.3查找组成DBA视图的底层对象 392
12.1.4使用有帮助的V$脚本 394
12.1.5 内存分配摘要(V$SGA) 397
12.1.6 内存分配的细节(V$SGASTAT) 398
12.1.7在V$PARAMETER中发现init.ora的设置 399
12.1.8 测定数据的命中率(V$SYSSTAT) 400
12.1.9测定数据字典的命中率(V$ROWCACHE) 401
12.1.10测定共享SQL和PL/SQL的命中率(V$LIBRARYCACHE) 401
12.1.11 确定需要固定的PL/SQL对象 402
12.1.12通过V$SQLAREA查找有问题的查询 403
12.1.13检查用户的当前操作及其使用的资源 404
12.1.14查找用户正在访问的对象 405
12.1.15使用索引 406
12.1.16确定锁定问题 408
12.1.17关闭有问题的会话 409
12.1.18查找使用多会话的用户 410
12.1.19查找磁盘I/O问题 411
12.1.20查找回滚段的内容 413
12.1.21检查空闲列表是否充足 414
12.1.22检查角色和权限设置 415
12.1.23 V$视图的种类 417
12.2技巧回顾 421
第13章 X$表(针对高级DBA) 423
13.1 X$表介绍 423
13.1.1有关X$表的误解 424
13.1.2授权查看X$表 425
13.2创建V$视图和X$表 426
13.3 获得所有X$表的列表 428
13.4获得所有的X$索引列表 430
13.5对X$表和索引使用提示 431
13.6共享池 432
13.7监控共享池的查询 433
13.7.1 ORA-04031错误 433
13.7.2空间分配过大而引起的争用 434
13.7.3碎片化 434
13.7.4共享池和/或Java池中空闲内存过低 435
13.7.5库缓存命中率 436
13.7.6大量的硬解析 438
13.7.7闩锁等待和/或休眠 438
13.7.8其他调整选项 439
13.8重做 440
13.9初始化参数 440
13.10缓存/数据块 444
13.10.1 缓存状态 445
13.10.2 占用数据块缓存的段 446
13.10.3热数据块/闩锁争用和等待事件 448
13.11 实例/数据库 452
13.12 高效使用X$表及其策略 453
13.13相关的Oracle内部机制 453
13.13.1 跟踪 453
13.13.2事件 453
13.13.3转储 454
13.13.4 Oradebug 455
13.14 X$表的分组 456
13.15 X$表及相关的非V$固定视图 470
13.16常见的X$表连接 472
13.16.1 9i中新增的X$表 474
13.17技巧回顾 476
13.16.2未记录入档的固定视图 476
13.16.3未来版本的影响 476
第14章 使用STATSPACK调整等待和闩锁(针对高级DBA) 478
14.1 安装STATSPACK 478
14.1.1 PERRFSTAT账户的安全管理 479
14.1.2安装之后 479
14.1.3搜集统计数据 480
14.1.4运行统计数据报表 483
14.2 解释STATSPACK的输出结果 483
14.2.1报表头信息 483
14.2.2 负载简档 484
14.2.3实例的效率 485
14.2.4首要等待事件 487
14.2.5首要的SQL语句 492
14.2.6实例活动统计数据 493
14.2.7表空间和文件I/O的统计数据 497
14.2.8其他的内存统计数据 498
14.2.9回滚/撤消统计数据 499
14.2.10闩锁统计数据 500
14.2.11 数据字典和库缓存的统计数据 504
14.2.12 SGA内存统计数据 506
14.2.13非默认的init.ora参数 508
14.3 STATSPACK输出结果中需首先查看的十项内容 508
14.3.1 管理STATSPACK数据 509
14.3.3 删除STATSPACK 510
14.4技巧回顾 510
第15章执行快速系统检查(针对DBA) 512
15.1 总体性能指数(TPI) 512
15.2教育性能指数(EPI) 513
15.3 系统性能指数(SPI) 515
15.4 内存性能指数(MPI) 516
15.4.1缓冲区命中率 517
15.4.2数据字典缓存命中率 518
15.4.4 内存排序命中率 519
15.4.3库缓存命中率 519
15.4.5空闲的数据缓冲区的比例 520
15.4.6最浪费内存的前十个语句占所有语句的比例 521
15.4.7调整前25个最浪费内存的语句 522
15.4.8固定/缓存对象 523
15.5磁盘性能指数(DPI) 524
15.5.1 调整滥用磁盘读操作的25个主要语句 525
15.5.2最浪费磁盘读操作的前十个语句占所有语句的比例 526
15.5.3 表/索引的分离 527
15.5.4关键任务表中的链接 527
15.5.5分离关键的Oracle文件 528
15.5.6回滚段的平衡 528
15.5.7临时段的平衡 529
15.6总体性能指数(TPI) 530
15.7.1 评级系统 531
15.7系统综合检查的示例 531
15.7.2系统检查评级分类的示例 532
15.7.3 需要立刻解决的问题项 533
15.7.4其他需要解决的问题项 533
15.8系统信息列表 533
15.8.1 与内存有关的值 534
15.8.2与磁盘有关的值 534
15.8.3与CPU有关的值 534
15.8.4与备份和恢复有关的信息 535
15.8.5命名约定和/或OFA标准以及安全信息 535
15.8.6 DBA知识评级 535
15.9技巧回顾 536
第16章 使用UNIX工具监控系统(针对DBA) 537
16.1 UNIX工具 537
16.1.1 使用sar命令监控CPU的使用 537
16.1.2使用top命令发现系统中最影响性能的用户 539
16.1.3使用uptime命令监控CPU的负载 540
16.1.4使用mpstat命令确定CPU瓶颈 541
16.1.5将ps命令与已选出的V$视图相结合 542
16.1.6使用sar命令监控磁盘I/O问题 545
16.1.7使用iostat确定磁盘I/O瓶颈 546
16.1.8使用sar命令和vmstat命令监控分页/交换 549
16.1.9使用ipcs命令确定共享内存的使用情况 551
16.1.10使用vmstat命令监控系统的负载 552
16.1.11 监控磁盘空闲空间 553
16.1.12监控网络性能 554
16.2技巧回顾 557
附录A 主要的in.t.ora参数(针对DBA) 558
A.1 不再支持的init.ora参数 558
A.2 不建议使用的init.ora参数 559
A.3 25个最重要的init.ora参数 559
A.5 最重要的13个未入档的init.ora参数 561
A.4必须记住的最重要的十个init.ora参数 561
A.6 已入档的init.ora参数列表(V$PARAMETER) 563
A.7 未入档的init.ora参数列表(x$ksppi/x$ksppcv) 573
A.8不写书的十个重要原因 574
A.9技巧回顾 574
附录B V$视图(针对DBA和开发人员) 575
B.1 V$视图、GV$视图和X$表的创建 575
B.2 Oracle9i(9.2.0.1.0)的GV$视图 576
B.3 Oracle9i(9.2.0.1.0)的V$视图 579
B.4用于创建V$视图的X$表的Oracle 9i脚本 582
附录C X$表(针对DBA) 675
C.1 按名称排序的Oracle9i X$表 675
C.2 Oracle9i X$索引 678
C.3 交叉引用V$视图的Oracle9i X$表 686
C.4 交叉引用X$表的Oracle9i GV$视图 692
C.5 GV$视图没有引用的Oracle9i X$表 699