本书通过翔实的代码实例,讲解如何用主动且高效的方法开发和调试完全依赖数据库的优化Oracle应用程序。理论知识、系统设计和实际问题紧密结合。语言流畅且浅显易懂,对问题的解释全面深入,是一本关于Oracle技术的高级手册。适合各种层次的数据库设计人员和DBA参考。
本书特色
■使用SQL*Plus、TKPROF、STATSPACK、JDeveloper以及其他工具
■利用Oracle的可伸缩的体系结构实现
■使用SPFILE、Oracle管理文件,以及自动段空间管理实现高效管理
■使用ARCHIVELOG模式、RMAN和数据保护完成数据库备份与恢复
■通过绑定变量和尽可能少做分析来改进语句处理
■充分利用基于成本的优化程序 (CBO)
■产生高效设计模式的数据结构选择
■编写高效的SQL语句和高效的PL/SQL代码
■跟随Oracle权威人士学习开发高效应用程序的正确方法
无
本书读者群为Oracle的开发团队,即对整个系统性能有100%控制权的团体。这个团队包括数据建模人员、程序开发人员和DBA。一个流行的神话是DBA负责应用系统性能的方方面面,并且能完全控制系统的性能。可以用赛车来说明这种老观念的谬误。DBA好比赛车场修理处人员,他负责换轮胎,保证给车加满油并让它正常工作。如果你给这位赛车场修理处人员(DBA)一辆Lincoln Navigator(一种极为巨大的卡车),并告诉他你打算用这车去参加方程式大赛,结果会怎样呢?DBA可以保证这辆卡车跑得尽可能快,但他不能让这辆卡车在急转弯时还能保持每小时100多公里的速度。除非把车扔了重新设计制造,否则一旦车辆设计制造出来,DBA能做的事就很少了(这里的车就是应用程序)。
本书主要面向对如何用Oracle设计和建造具有可伸缩性的系统还没有把握的读者群。本书不是一本初学者指南。它是针对那些已经知道如何输入SQL语句、如何使用SQL*Plus的Oracle开发人员的。我们讲授如何编写“好的”SQL,但不讲授SQL基础知识。讲授如何编写“好的”Oracle应用程序,而不讲授如何编写应用程序。
再举一个例子来说明本书将会提供什么信息。假如开发人员是医生,应用程序是病人。有多种医生:
急诊室(ER)医生 这些医生对患者进行“筛选”,区分绝症病人与可以救治的病人,在路上进行急救保持病人尽可能长时间存活。他们将会收到吸烟、具有不良饮食习惯又不锻炼的心脏病人,并且要稳定这些病人的病情。
手术室(OR)医生 病人在经过筛选且ER医生做过临时性处理后,由OR医生接收。OR医生经过艰苦的手术不仅要挽救病人的生命,而且还要尽可能使他恢复正常。他们给心脏病人做搭桥手术,尽量清理病人的动脉。
物理治疗专家(PT) 在OR医生完成手术后,病人就开始了漫长且痛苦的康复过程(不必说花费昂贵),这时就是PT的事了。
预防医生 这些医生尽量使病人不打扰上述三种医生。他们劝病人停止抽烟、吃有益于健康的食品、加强锻炼,并且编制一个有很多步骤的程序帮助他们保持良好状态。如果他们工作得当,除非意外事故(比如车祸),否则病人将永远不会再打扰ER、OR或者PT医生。
目前还需要各种医生,因为确实会发生事故。但是,最重要的医生或许是最后面的这种预防医生,他们尽力让病人不需要其他三种医生。
本人相信(实际如此),大多数人和书最关注前三种医生。他们极相信“英雄”开发人员——ER或OR医生。或许正因为这一点,良好的设计和实现一般是吃力不讨好的事情。ER和OR把病人从死亡的边缘拉了回来,获得了所有的声誉(做一些奇迹般的事情,挽救系统也是这样)。他们在最后一刻被召集起来,努力挽救病人的生命,并且得到丰厚的报酬;另一方面,物理治疗专家就不那么幸运了,他们接手ER/OR医生处理过的系统,负责维持其运转。
我完全可以站在ER的立场说话,因为事实上我就是那些被召集起来并使系统好起来的“英雄”中的一员。我可以撰写这样一本书,确实,也有人曾经告诉我,应该写这样一本书,但我没有写。
因为我们所缺少的是包括预防医生培训在内的综合方法。这方面的书籍有一些,我喜欢的有Guy Harrison的《Oracle SQL High Performance Tuning,2nd Edition》(Prentice Hall, 2001)和Jonathan Lewis的《Practical Oracle 8i Building Efficient Databases》(Addison Wesley, 2001)。这些书籍,包括我自己的《Expert One on One Oracle》(Wrox Press, 2001),致力于消除对英雄的需求。请注意,消防人员在救火时是英雄,但我们都希望永远不要和他们打交道。
本书作为一个指南,提供了进行性能调整的所有结构和方法,讨论的内容包括:
●开始设计前的调整。
●针对特定性能目标进行设计,并不断测试。
●反复试验(保证每个功能项按要求工作,并了解软件的性能,许多性能问题与不了解数据库如何工作有直接的关系)。
●实际的事故。研究ER/OR医生的角色,但这不是本书的最终目标之一。因为你所学到的作为一个预防医生的知识应该有助于限制那些更光彩的医生角色。
大多数书籍的重点完全放在如何当英雄上,本书则不然,本书的重点在于如何成为一个可靠的系统生产者。它着重建造一个完好的系统而不是修补破碎的系统。我们相信,时间会证明建造完好系统的人才是真正的英雄。
Thomas Kyte:Thomas Kyte: Oracle专业领域世界上最权威的专家之一。他是Oracle核心技术小组 (管理、教育和健康)副主席,兼《Oracle Magazine》及其在线论坛“Ask Tom”专栏作家,撰写过多部设计和构建高性能、可伸缩Oracle应用程序的指南。他回答过数以千计的技术问题,也正是这些问题激发了他写作这本书的灵感。
钟鸣 郝玉洁 等:暂无简介
本书是一本关于Oracle的高级手册,书中对Oracle的许多重要概念和特性进行了独到的讨论。它面向的是那些已经知道如何输入SQL语句、如何使用SQL*Plus的Oracle使用人员和开发人员。书中讲授了如何编写“好的”SQL,以及如何编写“好的”Oracle应用程序。
本书共10章及1个附录,各章及附录的内容如下。
第1章 构建应用程序的正确方法:讨论关于Oracle设计的最好方法的某些“软”问题。这些问题与系统设计、开发、测试、部署和维护有关,但它们并不是Oracle所特有的,只不过是从Oracle的角度提出而已。这一章是本书所有章节中涉及技术细节最少的一章,但可能是最重要的一章。
这一章中还对Oracle的各种文档进行了排序和简介,给希望进一步钻研Oracle的各类人员(如编程人员、DBA等)提供了需要阅读的书籍清单。
第2章 性能工具包:作者介绍了自己使用的工具并对为何使用这些工具做了一个概述。另外,还阐述了如何使用这些工具。
第3章 体系结构选择:介绍宏观层次上的体系结构选择,它可以帮助用户获得Oracle能够达到的可伸缩性和性能。该章不深入探讨Oracle服务器进程体系结构及内存结构,不介绍如何建立分区或并行处理,而是将主要精力集中在怎样或何时使用Oracle的这些特性上。
该章还讨论了Oracle体系结构对应用系统的作用,回答了“如何连接到数据库”、“分区能否使数据库运行得更快”等问题。
第4章 高效的管理:介绍作者认为对数据库管理非常有用的一些特性。如SPFILE、OMF、备份与恢复、字典管理的表空间(DMT)和本地管理的表空间(LMT)、ASSM、让Oracle自动管理回退段等。
第5章 语句处理:完整地介绍了Oracle怎样处理语句,详细讨论了主要语句类型(DDL、DML)的分析、优化和执行,包括查询语句的分析、优化和执行。讨论了绑定变量及其使用。最后,强调要尽可能地避免对语句进行分析。
第6章 从基于成本的优化程序获得最大输出:讨论了Oracle中两个不同的优化程序,说明为什么CBO目前值得重点考虑,特别是在Oracle9i Release 2之后的版本不再支持RBO的情况下更是如此。
该章讨论了两个对CBO影响最大的重要参数,它们分别是:OPTIMIZERINDEX COST ADJ和OPTIMIZERINDEXCACHING。该章中还介绍了影响CBO的许多其他参数,并举了许多例子。最后,介绍了10*!053跟踪事件,这是一个能帮助我们理解优化程序所做事情的工具。
第7章 高效的模式设计:应用系统将依赖其物理实现而生存或死亡。选择错误的数据结构会使性能达不到要求,灵活性受到限制。选择正确的数据结构,将会获得良好的性能。该章将考察设计模式时需要考虑的一些东西。然后集中精力讨论表类型、某些有用的索引类型以及压缩等内容。
第8章 高效的SQL:讨论提高查询效率的各种SQL技术,并指出,要想开发高效的SQL,必须对一些较深层次的SQL技术有所了解,如访问路径、连接、模式等。另外,为了开发高效的SQL,深刻理解要解决的问题是至关重要的。
第9章 高效的PL/SQL程序设计:讨论为什么应该考虑在应用程序中使用PL/SQL。然后介绍一些能提供高效、高性能PL/SQL代码的重要编程技术。
第10章 故障排除:介绍一些故障排除的经验和原则。
附录 设置和一些脚本:给出本书许多例子中都用到的BIGTABLE的建立脚本,以及作者经常使用的一些脚本(实用程序)。
参加本书翻译的主要成员有:钟鸣、郝玉洁。全书由刘晓霞同志审校。同时担任部分翻译及校对工作的还有常征、石永平、王君、张文、魏允韬、田晓涛、耿娜、何江华、梅刚、孙登峰、樊伟、李安娜、李晓军、苏秀玲、赵彦萍、马永良、张启斌等。
由于译者水平有限,书中难免有错误或不当之处,敬请读者批评指正。
译 者
2005年11月24日
第1章 构建应用程序的正确方法
11 团队协作
12 阅读资料文档
121 指南的指南
122 阅读路线
13 避免黑盒综合症
131 数据库独立与数据库依赖
132 黑盒综合症的危害
14 是数据库而不是一堆数据
141 使用主键和外部键
142 测试参考完整性的开销
143 中间层检查不是万能药
15 建立测试环境
151 用有代表性的数据进行测试
152 不要用单个用户进行测试
153 不要在无菌实验室中进行测试
16 设计出性能而不是调整出性能
161 不要使用通用数据模型
162 设计自己的高效数据模型
17 开始就定义性能目标
171 在清晰明确的标准下工作
172 随时收集并记录标准
173 别因为 “所有人都知道你应该做”而做某件事情
18 测试, 测试, 再测试
181 小基准测试
182 大基准测试
19 仪表化系统
191 追踪asktomoraclecom
192 远程调试仪表化
193 使用DBMSAPPLICATIONINFO
194 在PL/SQL中使用DEBUGF
195 在应用系统中打开SQLTRACE
196 使用业内标准的API
197 建立自己的例程
198 审计不仅仅是个词
110 敢于怀疑权威
1101 当心泛泛的 “最好”
1102 怀疑 “法定” 和 “神话”
111 不要走捷径
112 保持简单
1121 考虑备选方法
1122 让数据库充分发挥自己的能力
113 使用已有的功能
1131 我们听说X特性慢
1132 我们听说X特性复杂
1133 我们不想
1134 我们以前不知道
1135 我们希望数据库独立
114 本章小结
第2章 性能工具包
21 SQL*Plus
211 建立SQL*Plus
212 定制SQL*Plus环境
213 阅读文档
22 EXPLAIN PLAN
221 设置EXPLAIN PLAN
222 使用EXPLAIN PLAN
223 如何阅读查询计划
224 避免EXPLAIN PLAN陷阱
225 使用DBMSXPLAN和V$SQLPLAN
23 AUTOTRACE
231 建立AUTOTRACE
232 使用AUTOTRACE
233 格式化AUTOTRACE的输出
234 了解AUTOTRACE的输出
235 AUTOTRACE输出中感兴趣的内容
24 TKPROF
241 启用TKPROF
242 运行TKPROF
243 读TKPROF报告
244 各种群体对TKPROF的使用
25 Runstats
251 建立Runstats
252 使用Runstats
26 Statspack
261 建立Statspack
262 使用Statspack
263 使用Statspack易犯的错误
264 Statspack概览
27 DBMSPROFILER
271 为什么要使用配置文件管理器
272 配置文件管理器的资源
28 JDeveloper (及调试)
29 本章小结
第3章 体系结构选择
31 了解共享服务器与专用服务器连接
311 专用服务器如何工作
312 共享服务器连接如何工作
313 关于共享服务器配置的常见错误观点
314 专用服务器与共享服务器小结
32 利用集群
321 RAC如何工作
322 RAC的优点
323 集群小结
33 了解何时使用分区
331 分区概念
332 神秘的分区
333 为什么使用分区
334 分区小结
34 知道何时使用并行操作
341 并行神话
342 并行管理
343 并行查询
344 并行DML
345 打造自己的并行
346 并行处理小结
35 本章小结
第4章 高效的管理
41 用SPFILE启动数据库
411 PFILE的问题
412 SPFILE如何工作
413 让数据库使用SPFILE
414 保存系统参数的改动
415 PFILE过时了吗
416 求助, 我的SPFILE坏了, 我不能启动了
417 SPFILE小结
42 让Oracle来管理你的数据文件
421 何时使用OMF
422 OMF如何工作
423 OMF小结
43 可靠的恢复
431 备份准则
432 备份和恢复小结
44 使用本地管理的表空间
441 为什么要废除DMT
442 在不知道对象会变得有多大时使用系统管理的LMT
443 在知道对象的最终尺寸时使用统一的区尺寸
444 关于LMT的某些忠告
445 LMT和DMT小结
45 让Oracle管理你的段空间
451 理解可用列表和可用列表组
452 PCTFREE和PCTUSED怎样控制可用列表
453 ASSM的案例
454 ASSM小结
46 让Oracle管理回退段
461 设置UNDORETENTION
462 UNDO表空间忠告
463 UNDO表空间小结
47 本章小章
第5章 语句处理
51 理解SQL语句的类型
52 语句怎样执行
521 分析
522 优化和行资源生成
523 执行
524 语句执行小结
53 查询的处理过程
531 快速返回的查询
532 慢速返回的查询
533 一致性读取
54 DML语句的处理
55 DDL处理
56 使用绑定变量
561 绑定变量的优点
562 对Java和VB使用绑定变量
563 每项规则都有例外
564 绑定变量窥视
57 尽可能少做分析
571 分析的成本
572 使用PL/SQL减少分析
573 把SQL移出触发器以减少分析
574 准备一次; 执行多次
58 本章小结
第6章 从基于成本的优化程序获得最大输出
61 为什么停用RBO
62 使CBO发挥最大的作用
621 调整OPTIMIZERINDEXCACHING和OPTIMIZER INDEXCOSTADJ参数
622 使用SYSTEM统计数据
63 优化CBO
631 为升级设置COMPATIBLE
632 设置DBFILEMULTIBLOCK READCOUNT以减少全扫描的成本
633 设置HASHJOINENABLED控制散列连接
634 设置OPTIMIZERDYNAMICSAMPLING动态收集统计数据
635 设置OPTIMIZERFEATURESENABLE制特性选择
636 设置OPTIMIZERMAX PERMUTATIONS控制排列
637 设置OPTIMIZERMODE选择模式
638 用QUERYREWRITEENABLED和QUERYREWRITEINTEGRITYT重写查询
639 用BITMAPMERGEAREA SIZE、SORTAREASIZE、HAS HAREASIZE控制PGA内存
6310 对星查询使用STAR TRANSFORMATIONENABLED
6311 设置影响优化程序的其他几个参数
64 使用10053事件跟踪CBO选择
65 本章小结
第7章 高效的模式设计
71 基本模式设计原则
711 让数据库实现数据完整性
712 使用正确的数据类型
713 对最经常提的问题进行优化
72 表类型概述
73 B*树索引集群表
731 创建群
732 使用群
733 群小结
74 索引组织表
741 用IOT替代关联表以节省空间
742 利用IOT集中放置随机插入的数据
743 IOT小结
75 外部表
751 建立外部表
752 修改外部表
753 将外部表用于直接路径装载
754 将外部表用于并行直接路径装载
755 将外部表用于合并
756 处理外部表的错误
76 索引技术
761 使用FBI——打破常规
762 使用域索引
77 压缩
771 使用索引键压缩
772 对于只读或主要是读的表进行表压缩
773 压缩小结
78 本章小结
第8章 高效的SQL
81 编写高效SQL所需的知识
82 访问路径
821 全扫描
822 ROWID访问
823 索引扫描
824 群扫描
83 连接概念
831 嵌套循环
832 散列连接
833 排序合并连接
834 笛卡儿连接
835 反连接
836 全外部连接
84 模式问题(物理的)
85 真正理解SQL
851 ROWNUM伪列
852 标量子查询
853 分析函数
86 不调整查询
861 理解问题
862 概念验证的例子
87 其他SQL技术概览
88 本章小结
第9章 高效的PL/SQL程序设计
91 为什么要使用PL/QL
911 PL/SQL是数据操纵的最高效语言
912 PL/SQL具有可移植性和可重用性
92 尽可能少地编写代码
921 不用程序实现
922 让代码行数适合于屏幕显示
93 使用程序包
931 程序包的优点
932 断开依赖链
933 程序包小结
94 使用静态SQL
941 静态SQL的优点
942 寻找替换动态SQL的机会
943 静态SQL小结
95 批量处理
951 使用批量处理效果很好时再使用它
952 对ETL操作使用BULK处理
953 批量处理小结
96 返回数据
961 ref游标的优点
962 使用ref游标返回结果集
97 使用%TYPE和%ROWTYPE
971 基于表的记录类型
972 基于游标的记录类型
973 基于列的数据类型
98 使用调用者的权限
981 调用者权限和多模式
982 调用者权限的条件
99 使查找高效地工作
991 查找的单行取
992 查找的批量处理
993 查找的单语句操作
994 查找小结
910 当心独立事务处理
9101 独立事务处理的条件
9102 独立事务处理会影响数据完整性
911 选择使用隐式游标还是显式游标
9111 将隐式游标用于单行选择
9112 对有限行数的结果集使用隐式游标
9113 隐式/显式游标小结
912 本章小结
第10章 故障排除
101 找出差异
1011 开始收集今天的历史记录
1012 侦探性工作
102 一次只更改一样东西
103 更改一样东西要有充分理由
1031 有目标
1032 验证你的假设
104 能够恢复到更改前的状态
105 建立测试用例
1051 测试用例需求
1052 使测试用例尽可能小
106 本章小结
附录 设置和一些脚本