oracle编程艺术
第1 章:开发成功的Oracle 应用 从这一章开始,我将介绍数据库编程的基本方法。所有数据库创建得并不一样,要想按时、成功地 开发数据库驱动的应用,你必须了解你的数据库能做什么,它是怎么做的。如果不清楚你的数据库能做什 么,就很可能不断地遭遇“闭门造车”的窘境,徒劳地从头开发数据库本已提供的功能;如果不清楚你的 数据库是怎么工作的, 很可能开发出性能很差的应用,达不到预期的要求。 这一章先根据经验分析了一些应用,这些应用都因为缺乏对数据库的基本理解而导致项目失败。这 17 / 849 一章就采用这种“拿例子说话“的方式,讨论了开发人员必须了解数据库的哪些基本特性和功能。关键是, 不要把数据库当成一个黑盒,不要认为它能自己努力得出答案并自行负责可扩展性和性能。 第2 章:体系结构概述 这一章介绍Oracle 体系结构的基础知识。首先给出两个术语——“实例”(instance)和“数据库” (database)的明确定义,Oracle 领域中的许多人都对这两个词存在误解。我们还会简要介绍系统全局区 (System Global Area, SGA)和Oracle 实例底层的进程,并分析“连接Oracle”这样一个简单的动作 是如何实现的。 第3 章:文件 这一章将深入介绍构成Oracle 数据库和实例的8 类文件。从简单的参数文件到数据文件和重做日志 文件(redo log file)都会涵盖。我们将说明这些文件是什么,为什么有这些文件,以及如何使用它们。 第4 章:内存结构 这一章讨论Oracle 如何使用内存,包括各个进程中的内存(PGA 内存,PGA 即进程全局区)和共享内 存(SGA)。我们会分析手动和自动PGA 内存管理之间的区别,并介绍Oracle 10g 中的SGA 内存管理,还会 说明各种方法适用于什么情况。读完这一章之后,你会对Oracle 如何使用和管理内存有深入的了解。 第5 章:Oracle 进程 这一章概述了各种Oracle 进程(服务器进程和后台进程),另外还相当深入地讨论了通过共享服务器 进程或专用服务器进程连接数据库有何区别。启动Oracle 实例时会看到一些后台进程,这一章将逐一介绍 其中一些重要的后台进程(如LGWR、DBWR、PMON 和SMON),并分别讨论这些进程的功能。 第6 章:锁 不同的数据库有不同的行事方法(SQL Server 里能做的在Oracle 中不一定能做)。应当了解Oracle 如何实现锁定和并发控制,这对于应用的成功至关重要。这一章将讨论Oracle 解决这些问题的基本方法, 可以应用哪些类型的锁[DML、DDL 和闩(latch)],还会指出如果锁定实现不当会出现哪些问题(死锁、 阻塞和锁升级)。 第7 章:并发与多版本 这一章介绍我最喜欢的Oracle 特性——多版本(multi-versioning),并讨论它并发控制和应用设计 有什么影响。在这里能清楚地看到,所有数据库创建得都不一样,具体的实现会对应用的设计产生影响。 我们先回顾ANSI SQL 标准定义的各个事务隔离级别,并介绍它们在Oracle 中的具体实现(还会介绍其他 数据库中的实现)。基于多版本特性,Oracle 能够在数据库中提供非阻塞读(non-blocking read)。本章 接下来会分析多版本特性对我们有什么影响。 第8 章:事务 事务是所有数据库的一个基本特性,这也是数据库区别于文件系统的一个方面。不过,事务常常遭到 误解,很多开发人员甚至不知道他们有时没有使用事务。这一章讨论Oracle 中应当如何使用事务,还列出 18 / 849 了使用数据库进行开发时可能出现的一些“坏习惯”。特别地,我们将讨论原子性的含义,并说明原子性对 Oracle 中的语句有何影响。这一章还会讨论事务控制语句(COMMIT、SAVEPOINT 和ROLLBACK)、完整性约 束和分布式事务(两段提交或2PC),最后介绍自治事务。 第9 章:redo 与undo 可能有人说,开发人员不用像DBA 那样深入了解redo(重做信息)和undo(撤销信息)的细节,但 是开发人员确实要清楚redo 和undo 在数据库中所起的重要作用。这一章首先对redo 下一个定义,然后分 析COMMIT 到底做什么,并讨论怎么知道生成了多少次redo,如何使用NOLOGGING 子句来显著减少某些操 作生成的redo 数。我们还研究了redo 生成与块清除(block cleanout)和(log contention)等问题的 关系。 这一章的undo 一节中讨论了撤销数据的作用,并介绍哪些操作会生成最多/最少的undo。最后分析 “讨厌”的ORA-01555:snapshot too old(ORA-01555:快照太旧)错误,解释导致这个错误的可能原因, 并说明如何避免。 第10 章:数据库表 Oracle 现在支持多种表类型。这一章将分别介绍每一种类型,包括堆组织表(heap organized,也 就是默认的“普通”表)、索引组织表(index organized)、索引聚簇表(index clustered)、散列聚簇表 (hash clustered)、嵌套表(nested)、临时表(temporary)和对象表(object),并讨论什么时候使用 这些类型的表、如何使用以及为什么使用。大多数情况下,堆组织表就足够了,不过这一章还将帮助你认 识到在哪些情况下使用其他类型的表更合适。 第11 章:索引 索引是应用设计的一个重要方面。要想正确地实现索引,要求深入地了解数据,清楚数据如何发布, 并且知道要如何使用数据。人们经常把索引当作“马后炮”,直到应用开发的后期才增加,这就会导致应用 的性能低下。 这一章将详细分析各种类型的索引,包括B*Tree 索引、位图索引(bitmap index)、基于函数索引 (function-based index)和应用域索引(application domain index),并讨论各种索引应该在哪些场合 使用,以及哪些场合不适用。我会在“有关索引的常见问题和神话”一节回答常常被问到的一些问题,如 “索引能在视图上使用吗?”和“为什么没有使用我的索引?”。 第12 章:数据类型 有许多数据类型(datatype)可供选择。这一章会逐一分析22 种内置数据类型,解释这些类型是如 何实现的,并说明如何以及何时使用这些数据类型。首先对国家语言支持(National Language Support, NLS)做一个简要的概述;要想充分理解Oracle 中简单的串类型,必须先掌握这个基础知识。接下来再讨 论广泛使用的NUMBER 类型,并介绍Oracle 10g 对于在数据库中存储数值又提供了哪些新的选项。我们主 要从历史角度介绍LONG 和LONG RAW 类型,目的是讨论如何处理应用中遗留的LONG 列,并将其移植为LOB 类型。然后会深入介绍分析存储日期和时间的各种数据类型,讨论如何处理这些数据类型来得到我们想要 的结果。这里还会谈到时区支持的有关细节。 接下来讨论LOB 数据类型。我们会说明LOB 类型的存储方式,并指出各种设置(如IN ROW、CHUNK、 19 / 849 RETENTION、CACHE 等)对我们有什么意义。处理LOB 时,重要的是要了解默认情况下它们如何实现和存储, 在对LOB 的获取和存储进行调优时这一点尤其重要。本章的最后介绍ROWID 和UROWID 类型。这些是Oracle 专用的特殊类型,用于表示行地址。我们会介绍什么时候可以将它们用作表中的列数据类型(这种情况几 乎从来不会出现!)。 第13 章:分区 分区(partitioning)的目的是为了便于管理非常大的表和索引,即实现一种“分而治之”的逻辑, 实际上就是把一个表或索引分解为多个较小的、更可管理的部分。在这方面,DBA 和开发人员必须协作, 使应用能有最大的可用性和最高的性能。这一章介绍了表分区和索引分区。我们会谈到使用局部索引(在 数据仓库中很常用)和全局索引(常见于OLTP 系统)的分区。 第14 章:并行执行 这一章介绍了Oracle 中并行执行(parallel execution)的概念,并说明了如何使用并行执行。首 先指出并行处理在什么情况下有用,以及哪些情况下不应考虑使用它。有了一定的认识后,再来讨论并行 查询的机制,大多数人提到并行执行都会想到这个特性。接下来讨论并行DML(parallel DML, PDML), 利用PDML,可以使用并行执行完成修改。我们会介绍PDML 在物理上如何实现,并说明为什么这个实现会 对PDML 带来一系列限制。 然后再来看并行DDL。在我看来,这才是并行执行真正的闪光之处。通常,DBA 会利用一些小的维护 窗口来完成大量的操作。利用并行DDL,DBA 就能充分利用可用的机器资源,在很短的时间内完成很大、很 复杂的操作(它只需原先串行执行所需时间的很小一部分)。 这一章的最后将讨论过程并行机制(procedural parallelism),采用这种方法可以并行地执行应用 程序代码。这里将介绍两个技术。首先是并行管线函数(parallel pipelined function),即Oracle 能动 态地并行执行存储函数。第二个技术是DIY 并行机制(DIY parallelism),利用这个技术可以把应用设计 为并发地运行。 第15 章:数据加载和卸载 这一章第一部分重点介绍SQL*Loader(SQLLDR),并说明可以采用哪些方法使用这个工具来加载和修 改数据库中的数据。我们会讨论以下问题:加载定界数据,更新现有的行和插入新行,卸载数据,以及从 存储过程调用SQLLDR。重申一遍,SQLLDR 是一个完备而重要的工具,但它的实际使用也带来很多问题。这
用户评论