欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle 9i & 10g编程艺术-深入数据库体系结构——目录(转)

程序员文章站 2022-07-14 18:32:28
...

1章:开发成功的Oracle应用

从这一章开始,我将介绍数据库编程的基本方法。所有数据库创建得并不一样,要想按时、成功地开发数据库驱动的应用,你必须了解你的数据库能做什么,它是怎么做的。如果不清楚你的数据库能做什么,就很可能不断地遭遇“闭门造车”的窘境,徒劳地从头开发数据库本已提供的功能;如果不清楚你的数据库是怎么工作的,很可能开发出性能很差的应用,达不到预期的要求。

这一章先根据经验分析了一些应用,这些应用都因为缺乏对数据库的基本理解而导致项目失败。这一章就采用这种“拿例子说话“的方式,讨论了开发人员必须了解数据库的哪些基本特性和功能。关键是,不要把数据库当成一个黑盒,不要认为它能自己努力得出答案并自行负责可扩展性和性能。

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实例时会看到一些后台进程,这一章将逐一介绍其中一些重要的后台进程(如LGWRDBWRPMONSMON),并分别讨论这些进程的功能。

6章:锁

不同的数据库有不同的行事方法(SQL Server里能做的在Oracle中不一定能做)。应当了解Oracle如何实现锁定和并发控制,这对于应用的成功至关重要。这一章将讨论Oracle解决这些问题的基本方法,可以应用哪些类型的锁[DMLDDL和闩(latch],还会指出如果锁定实现不当会出现哪些问题(死锁、阻塞和锁升级)。

7章:并发与多版本

这一章介绍我最喜欢的Oracle特性——多版本(multi-versioning),并讨论它并发控制和应用设计有什么影响。在这里能清楚地看到,所有数据库创建得都不一样,具体的实现会对应用的设计产生影响。我们先回顾ANSI SQL标准定义的各个事务隔离级别,并介绍它们在Oracle中的具体实现(还会介绍其他数据库中的实现)。基于多版本特性,Oracle能够在数据库中提供非阻塞读(non-blocking read)。本章接下来会分析多版本特性对我们有什么影响。

8章:事务

事务是所有数据库的一个基本特性,这也是数据库区别于文件系统的一个方面。不过,事务常常遭到误解,很多开发人员甚至不知道他们有时没有使用事务。这一章讨论Oracle中应当如何使用事务,还列出了使用数据库进行开发时可能出现的一些“坏习惯”。特别地,我们将讨论原子性的含义,并说明原子性对Oracle中的语句有何影响。这一章还会讨论事务控制语句(COMMITSAVEPOINTROLLBACK)、完整性约束和分布式事务(两段提交或2PC),最后介绍自治事务。

9章:redoundo

可能有人说,开发人员不用像DBA那样深入了解redo(重做信息)和undo(撤销信息)的细节,但是开发人员确实要清楚redoundo在数据库中所起的重要作用。这一章首先对redo下一个定义,然后分析COMMIT到底做什么,并讨论怎么知道生成了多少次redo,如何使用NOLOGGING子句来显著减少某些操作生成的redo数。我们还研究了redo生成与块清除(block cleanout)和(log contention)等问题的关系。

这一章的undo一节中讨论了撤销数据的作用,并介绍哪些操作会生成最多/最少的undo。最后分析“讨厌”的ORA-01555snapshot too oldORA-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 SupportNLS)做一个简要的概述;要想充分理解Oracle中简单的串类型,必须先掌握这个基础知识。接下来再讨论广泛使用的NUMBER类型,并介绍Oracle 10g对于在数据库中存储数值又提供了哪些新的选项。我们主要从历史角度介绍LONGLONG RAW类型,目的是讨论如何处理应用中遗留的LONG列,并将其移植为LOB类型。然后会深入介绍分析存储日期和时间的各种数据类型,讨论如何处理这些数据类型来得到我们想要的结果。这里还会谈到时区支持的有关细节。

接下来讨论LOB数据类型。我们会说明LOB类型的存储方式,并指出各种设置(如IN ROWCHUNKRETENTIONCACHE等)对我们有什么意义。处理LOB时,重要的是要了解默认情况下它们如何实现和存储,在对LOB的获取和存储进行调优时这一点尤其重要。本章的最后介绍ROWIDUROWID类型。这些是Oracle专用的特殊类型,用于表示行地址。我们会介绍什么时候可以将它们用作表中的列数据类型(这种情况几乎从来不会出现!)。

13章:分区

分区(partitioning)的目的是为了便于管理非常大的表和索引,即实现一种“分而治之”的逻辑,实际上就是把一个表或索引分解为多个较小的、更可管理的部分。在这方面,DBA和开发人员必须协作,使应用能有最大的可用性和最高的性能。这一章介绍了表分区和索引分区。我们会谈到使用局部索引(在数据仓库中很常用)和全局索引(常见于OLTP系统)的分区。

14章:并行执行

这一章介绍了Oracle中并行执行(parallel execution)的概念,并说明了如何使用并行执行。首先指出并行处理在什么情况下有用,以及哪些情况下不应考虑使用它。有了一定的认识后,再来讨论并行查询的机制,大多数人提到并行执行都会想到这个特性。接下来讨论并行DMLparallel DML PDML),利用PDML,可以使用并行执行完成修改。我们会介绍PDML在物理上如何实现,并说明为什么这个实现会对PDML带来一系列限制。

然后再来看并行DDL。在我看来,这才是并行执行真正的闪光之处。通常,DBA会利用一些小的维护窗口来完成大量的操作。利用并行DDLDBA就能充分利用可用的机器资源,在很短的时间内完成很大、很复杂的操作(它只需原先串行执行所需时间的很小一部分)。

这一章的最后将讨论过程并行机制(procedural parallelism,采用这种方法可以并行地执行应用程序代码。这里将介绍两个技术。首先是并行管线函数(parallel pipelined function),即Oracle能动态地并行执行存储函数。第二个技术是DIY并行机制(DIY parallelism),利用这个技术可以把应用设计为并发地运行。

15章:数据加载和卸载

这一章第一部分重点介绍SQL*LoaderSQLLDR),并说明可以采用哪些方法使用这个工具来加载和修改数据库中的数据。我们会讨论以下问题:加载定界数据,更新现有的行和插入新行,卸载数据,以及从存储过程调用SQLLDR。重申一遍,SQLLDR是一个完备而重要的工具,但它的实际使用也带来很多问题。这一章第二部分主要讨论外部表,这是另外一种数据批量加载和卸载的高效方法。

源代码和有关更新

使用这本书中的例子时,你可能想亲手键入所有代码。很多读者都喜欢这样做,因为这是熟悉编码技术的一种好方法。

无论你是否想自己键入代码,都能从Apress网站(http://www.apress.com)的Source Code区下载本书的所有源代码。即使确实想自己键入代码,下载源代码也很有必要,你可以使用下载的源代码文件检查正确的结果是什么。如果你认为自己的录入可能有误,就可以先从这一步开始。倘若不想自己键入代码,那么除了从Apress网站下载源代码外别无选择!不论采用哪种方式,代码文件都能帮助你完成更新和调试。

勘误表

Apress极力确保文字或代码不会出错。不过,出错也是人之常情,所以只要发现并修改了错误,我们就会及时告诉你。Apress所有书籍的勘误表都可以在http://www.apress.com上找到。如果你发现一个还没有报告的错误,请通知我们。

Apress网站还提供了其他的信息和支持,包括所有Apress书籍的代码、样章、新书预告以及相关主题的文章等。