本书是一本关于Oracle 9j az& 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,以及分区和并行,并利用具体的例子来充分介绍每个特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这个特性来开发软件,以及有关的常见陷阱。
本书面向从事Oracle数据库应用的所有开发人员的或DBA。
第1章 开发成功的Oracle应用
1.1 我的方法
1.2 黑盒方法
1.3 开发数据库应用的正确(和不正确)方法
1.4 小结
第2章 体系结构概述
2.1 定义数据库和实例
2.2 SGA和后台进程
2.3 连接Oracle
2.4 小结
第3章 文件
3.1 参数文件
3.2 跟踪文件
3.3 警告文件
3.4 数据文件
3.5 临时文件
3.6 控制文件
3.7 重做日志文件
3.8 密码文件
3.9 修改跟踪文件
3.10 闪回日志文件
3.11 DMP文件(EXP/IMP文件)
3.12 数据泵文件
3.13 平面文件
3.14 小结
第4章 内存结构
第5章 Oracle进程
第6章 锁
第7章 并发与多版本
第8章 事务
第9章 redo与undo
第10章 数据库表
第11章 索引
第12章 数据类型
第13章 分区
第14章 并行执行
第15章 数据加载和卸载
索引
译 者 序
每个人都可能有自己的学习套路。学习一个新工具时,有些人可能只是找一本入门书,粗略地翻翻就浅尝辄止,并相信实践出真知;有些人更喜欢系统地研习文档,对每个细节精雕细刻;有些人喜欢收集一些独门密技;有些人喜欢亲身尝试书上的基本用例……。每种方法都有可取之处,但我相信,真正的学习应该是“参考+实践”。盲目实践会频繁遇到本来可以避免的陷阱和失败,耽于参考又会成为纸上谈兵,无法得到真才实学。
学习Oracle时,很多书和资料都很有参考价值,特别是Oracle文档,更是全面地提供了我们想了解的信息。但是文档中没有实战用例,没有告诉我们哪些可行或者哪些不可行,什么情况下可行或者什么情况下不可行,为什么可行或者为什么不可行,它只是“公事公办”为你呈上厚厚的一摞文字,告诉你情况就是这样,你自己看着办吧。Thomas Kyte的这本书正好弥补了这一点,他使用大量实际的例子来解释所阐述的概念,由浅入深地传授实战技术。如果你喜欢Oracle,需要更多地了解Oracle,这本书绝对值得一读。
本书第1章强调不要把数据库当成一个黑盒,讨论了开发人员必须了解的数据库的基本特性和功能。第2章提供了一个创建Oracle数据库的绝好例子,从中你将深入地了解数据库和实例的概念。第3章介绍了各种类型的文件,特别是重做日志文件、闪回日志文件等。第4章关于内存,具体介绍了一些新选项,如何使用这些选项,以及要注意哪些问题。第5章讨论各个进程的功能。第6章至第8章分别介绍锁和闩、多版本以及事务。这几章是本书的精华,而且也是理解Oracle的关键所在。第9章讨论redo和undo,解释了它们分别是什么,并指出如何避免各种可能出现的错误。第10章介绍了各种类型的表,其中最重要的是堆组织表、索引组织表、临时表和外部表。你能从这一章中了解到改善性能的一些技巧。第11章讨论了有关索引的问题。第12章涵盖了Oracle中的各种数据类型。第13章讨论了分区,这一章开场白里就提出警告——不要把分区当作一个提速开关,并在接下来的内容中详细分析了分区的有关问题。第14章介绍了并行执行,如并行DML、并行DDL等。这里作者给出了自己从实际经验中总结的许多见解,指出并行DDL是Oracle并行执行的闪光点。最后一章介绍了数据的加载和卸载,不仅详细说明了常用的SQL*Loader工具,还解释了如何用外部表加载数据。尽管外部表从很大程度上优于SQL*Loader,但使用外部表并没有完全摒弃SQL*Loader,而且完全可以利用SQL*Loader来为外部表生成CREATE语句。
在Oracle领域中,大概无人不识Thomas Kyte,也无人不知他的Expert One-on-One Oracle。本书是该书的全新改版,涵盖了Oracle9i和10g,并专门介绍了最重要的Oracle体系结构特性。翻译这样一本巨著,确实让我们很有压力,所以我们不敢马虎,尽力用准确、贴切的语言表述出作者的原意。但是由于水平有限,译文肯定有不当之处,敬请批评指正。
译者
2006年7月
Thomas Kyte是Oracle公司核心技术集团的副总裁,从Oracle709版本开始就一直任职于Oracle公司。不过,其实他从5.1.5c版本就开始使用Oracle了。在Oracle公司,Kyte专门负责Oracle数据库,他的任务是帮助使用Oracle数据库的客户,并与他们共同设计和构建系统,或者对系统进行重构和调优。进入Oracle公司之前,Kyte是一位系集成师,主要为美国军方和政府部门的客户构建规模、异构数据库。
Thomas Kyte就是主持Oracle Magazine “Ask Tom”专栏和Oracle公司同名在线论坛的那个Tom,他通过这一方式热心地回答困扰着全世界Oracle开发人员和DBA的各种问题。
前 言
过去我一直在开发Oracle软件,并与其他Oracle开发人员一同工作,帮助他们构建可靠、健壮的应用程序。在这个过程中积累了一些经验,正是这些经验赋予我灵感,才有了本书中的内容。这本书实际上反映了我每天做了些什么,汇集了我所看到的人们每天遇到的问题。
本书涵盖了我认为最重要的一些内容,即Oracle数据库及其体系结构。我也可以写一本书名类似的其他方面的书,向你解释如何用一种特定的语言和体系结构开发应用程序。例如,我可以告诉你如何使用 JavaServer Pages(JSP)与Enterprise JavaBeans(EJB)通信,EJB再如何使用JDBC与Oracle通信。不过,归根结底,你最后还是要了解Oracle数据库及其体系结构(本书介绍的内容),才能成功地构建这样一个应用程序。要想成功地使用Oracle进行开发,我认为有些内容你必须了解,而不论你是一位使用ODBC的Visual Basic程序员、使用EJB和JDBC的Java程序员,还是使用DBI Perl的Perl程序员,这本书都会介绍这些通用的知识。本书并不推崇哪一种特定的应用体系结构,在此没有比较三层结构和客户/服务器结构孰优孰劣。我们只是讨论了数据库能做什么,另外关于数据库如何工作,我们还会指出你必须了解哪些内容。由于数据库是所有应用体系结构的核心,所以这本书适用面很广。
在编写本书时,我对Expert One-on-One Oracle一书中关于体系结构的章节做了全面修订和更新,并补充了大量新的内容。Expert One-on-One Oracle一书所基于的版本是Oracle 8.1.7,在此之后又推出了3个版本——两个Oracle9i版本和Oracle数据库10g Release 1,这也是写这本书时的Oracle发行版本。因此,有许多新的功能和新的特性需要介绍。
如果针对9i和10g更新Expert One-on-One Oracle,那么需要补充的内容太多了,那本书原本篇幅较多,再加太多内容就会很难处理。出于这个考虑,我们决定分两本书来介绍。这是其中的第一本,第二本书暂定名为Expert Oracle Programming 。
顾名思义,本书的重点是数据库体系结构,并强调数据库本身如何工作。我会深入地分析Oracle数据库体系结构,包括文件、内存结构以及构成Oracle数据库(database)和实例(instance)的底层进程。然后讨论一些重要的数据库主题,如锁定、并发控制、事务、redo和undo,还会解释为什么了解这些内容很重要。最后,我们再来分析数据库中的物理结构,如表、索引和数据类型,并介绍哪些技术能最优地使用这些物理结构。
本书内容
如果开发的选择余地很大,则会带来一些问题,其中一个问题是有时很难确定哪种选择是满足特定需求的最佳选择。每个人都希望灵活性尽可能大(有尽可能多的选择),同时他们又希望能简单明了,换句话说,希望尽量容易。Oracle为开发人员提供的选择几乎无穷无尽。没有人会说“这在Oracle中做不到”,而只会说“在Oracle中你想用多少种不同的方法来实现?”希望这本书能帮你做出正确的选择。
如果你不只是想知道做何选择,还想了解有关Oracle特性和功能的一些原则和实现细节,这本书就很适合你。例如,Oracle有一个很棒的特性,称为并行执行(parallel execution)。Oracle文档会告诉你如何使用这个特性,并说明它到底能做什么。不过,Oracle文档没有告诉你应该在什么时候用这个特性,更重要的是没有指出什么时候不该使用这个特性。另外,文档一般没有提供特性的实现细节,如果你不清楚,可能会因此而困扰(我指的不是bug,而是说你可能很想知道这个特性如何工作,以及为此是怎样具体设计的,但从文档中找不到答案)。
在本书中,我不仅会尽力阐明各个特性如何工作,还会指出什么情况下要考虑使用某个特性或实现,并解释为什么。我认为,理解“怎么做”固然很重要,但理解“什么时候做”和“为什么这样做”(以及“什么时候不做”和“为什么不做”)也同样重要!
读者对象
这本书面向那些使用Oracle作为数据库后端开发应用程序的人员。专业Oracle开发人员如果想了解如何在数据库中完成某些工作,同样可以参考本书。本书相当实用,所以DBA也会对书中的许多内容感兴趣。书中大部分例子都使用SQL*Plus来展示关键特性,所以如果你想通过本书来了解如何开发一个很酷的GUI,可能不能如愿。不过,从这本书中,你将知道Oracle数据库如何工作,它的关键特性能做些什么,以及什么时候应该(和不应该)使用这些特性。
如果你想事半功倍地使用Oracle,如果你想了解使用现有特性的新方法,如果你想知道这些特性在真实世界中如何应用(不只是展示如何使用特性,而是首先分析为什么要用这个特性),就请阅读这本书。作为技术经理,如果你手下的开发人员在开发Oracle项目,你可能也会对这本书感兴趣。从某种程度上讲,技术经理也要懂数据库,而且要知道这对于成功至关重要。如果技术经理想安排员工进行适当的技术培训,或者想确保员工了解他们应该掌握的技术,就可以利用这本书来“充电”。
要想更好地学习本书的内容,要求读者:
了解SQL。不要求你能编写最棒的SQL代码,但是如果用过SQL,对SQL有实战经验,这会很有帮助。
掌握PL/SQL。这不是一个必要的前提,但是有助于你“领会”书中的例子。例如,本书不会教你怎样编写一个FOR循环,或者如何声明一个记录类型,这些内容可以参考Oracle文档和许多相关的图书。不过,这并不是说你从本书中学不到PL/SQL的知识。不是这样的。通过阅读本书,你会对PL/SQL的许多特性相当熟悉,而且会学到一些新方法,还会注意到你以前以为不存在的一些包和特性。
接触过某种第三代语言(third-generation language,3GL),如C或Java。我相信,如果你能阅读3GL语言编写的代码,或者编写过这种代码,肯定能顺利地阅读和理解本书中的例子。
熟悉Oracle Concepts手册。
最后再说两句,由于Oracle文档实在太庞大了,这让很多人都有些畏惧。如果你刚开始读Oracle Concepts手册,或者还没有看过,那我可以告诉你,这个手册绝对是一个很好的起点。它大约有700页,涉及了你需要知道的许多重要的Oracle概念。其中不会涵盖每一个技术细节(Oracle文档提供了技术细节,不过它有10 000~20 000页之多),但你能从中学到所有重要的概念。
这个手册涉及以下主题(这里所列的并不完整):
数据库中的结构,数据如何组织和存储;
分布式处理;
Oracle的内存体系结构;
Oracle的进程体系结构;
你要使用的模式对象(表、索引、聚簇等);
内置数据类型和用户定义的数据类型;
SQL存储过程;
事务如何工作;
优化器;
数据完整性;
并发控制。
我自己也会时不时地温习这些内容。这些都是基础,如果不了解这些知识,你创建的Oracle应用程序就很容易失败。建议你通读Oracle Concepts手册来了解这些主题。
本书组织结构
为了帮助你更好地使用这本书,大部分章节都组织为4个部分。这个划分并不严格,不过有助于你快速地找到感兴趣的方面,从中获得所需的更多信息。本书有15章,每一章都像一本“迷你书”,可以单独成册。有时我会引用其他章中的例子或特性,不过你完全可以从书中任选一章,不参考其他章也能顺利阅读。例如,要理解或使用第14章关于并行机制的知识,就不必先阅读介绍数据库表的第10章。
许多章的格式和风格基本上都一样:
首先是特性或功能的介绍。
说明为什么可能想使用(或者不想使用)这个特性或功能。我会概要地指出哪些情况下要考虑使用这个特性,而哪些情况下这个特性不适用。
如何使用这个特性。这里提供的信息不是完全照搬SQL参考资料中的内容,而是会以一种循序渐进的方式组织。我会清楚地指出哪些是你需要的,哪些是你必须做的,另外哪些环节需要仔细检查。这一部分包括以下内容:
如何实现这个特性;
许许多多的例子;
如何调试这个特性;
使用这个特性的忠告;
如何(主动地)处理错误。
对上述内容的小结。
书中有相当多的例子和大量的代码,这些都可以从http://www.apress.com的Source Code区下载。下面将详细介绍每一章的内容。
第1章:开发成功的Oracle应用
从这一章开始,我将介绍数据库编程的基本方法。所有数据库创建得并不一样,要想按时、成功地开发数据库驱动的应用,你必须了解你的数据库能做什么,它是怎么做的。如果不清楚你的数据库能做什么,就很可能不断地遭遇“闭门造车”的窘境,徒劳地从头开发数据库本已提供的功能;如果不清楚你的数据库是怎么工作的,很可能开发出性能很差的应用,达不到预期的要求。
这一章先根据经验分析了一些应用,这些应用都因为缺乏对数据库的基本理解而导致项目失败。这一章就采用这种“拿例子说话”的方式,讨论了开发人
无封面