再上一篇:10.9临时表
上一篇:10.10对象表
主页
下一篇:11.1 Oracle索引概述
再下一篇:11.2 B*树索引
文章列表

10.11小结

Oracle 9i 10g编程艺术:深入数据库体系结构

读完这一章后,希望你已经得出这样一个结论:并非所有的表都创建得完全一样。Oracle提供了多 种表类型可供使用。在这一章中,我们介绍了一般情况下表的一些突出的方面,并分析了 Oracle为我们提 供的各种表类型。
首 先,我们介绍了与表相关的一些术语以及存储参数。这里讨论了freelist在多用户环境中的作用 , 如果多个人同时频繁地插入/更新一个表, freelist将产生很大影响;另外说明了如果使用ASSM表空间, 就不必再考虑freelist。我们研究了PCTFREE和PCTUSED的含义, 并为如何正确地设置这些信息提供了 一些指导原则。
然 后开始介绍各种类型的表,先从最常见的堆表开始。堆组织表是目前大多数Oracle应用中最常用 的表,这也是默认的表类型。接下来介绍索引组织表 (IOT),利用IOT,可以把表数据存储在索引结构 中而不是堆表中。我们了解了这些表适用于哪些情况(如查询表和反向表),在这些情况下,堆表就不合 适 了,它将只是数据的一个冗余副本。在本章的后面,我们还指出了结合使用 IOT与其他表类型确实很有 用,特别是嵌套表类型。
我们还介绍了聚簇对象,Oracle中有3种聚簇:索引聚簇、散列聚簇和有序散列聚簇。聚簇有两方 面的目标:
q 使我们能够把多个表的数据共同存储在同一个(多个)数据库块上。
q 是我们能够强制把类似的数据根据某个聚簇键物理地存储在“一起“。例如,采用这种方 式,部门10的所有数据(来自多个表)可以存储在一起。
基于这些特性,我们可以非常快地访问相关的数据,而且只有最少的物理I/O。我们研究了索引聚簇 和散列聚簇之间的主要区别,并讨论了各种聚簇分别在何种情况下适用(和不适用)。
接 下来转向嵌套表。我们介绍了嵌套表的语法、语义和用法,了解到嵌套表实际上就是系统生成和 维护的父/子表对,并且知道了Oracle在物理上是如何做到这 一点的。我们分析了可以使用不同的表类型 来实现嵌套表,默认会使用基于堆的表。我们发现,如果不使用IOT而使用堆表来实现嵌套表,一般这都 是说不过去 的。
接下来我们介绍了临时表的有关细节,包括如何创建、从哪里得到存储空间,还说明了临时表在运行 时不会引入与并发性相关的任何问题。我们分析了会话级和事务级临时表之间的区别,讨论了 Oracle数据 库中使用临时表的适当方法。
在这一章的最后,我们讨论了对象表的内部工作原则。我们发现,与嵌套表一样,Oracle的对象表 在底层也有很多“动作“。在此指出:利用关系表上的对象视图可以得到对象表的功能,与此同时还能轻 松地访问底层关系数据。

第11章 索引

索引是应用设计和开发的一个重要方面。如果有太多的索引,DML的性能就会受到影响。如果索引太 少,又会影响查询(包括插入、更新和删除)的性能。要找到一个合适的平衡点,这对于应用的性能至关 重要。
我 常常发现,人们在应用开发中总是事后才想起索引。我坚持认为这是一种错误的做法。如果你知 道数据将如何使用,从一开始就应该能提出应用中要使用怎样的索 引,即具有一组代表性的索引。不过, 一般的做法却往往是随应用“放任自流“,过后才发现哪里需要索引,这种情况实在太多了。这说明,你 没有花时间来了解数 据将如何使用以及最终要处理多少行。经过一段时间后,随着数据量的增长,你会不 停地向系统增加索引(也就是说,你所执行的是一种反应式调优)。你就有一些 冗余而且从不使用的索引, 这不仅会浪费空间,还会浪费计算资源。磨刀不误砍柴工,如果刚开始的时候花几个小时好好地考虑何时 为数据加索引,以及如何加索 引,这肯定能在以后的”调优“中节省更多的时间(注意,我所说的是”肯 定能“节省更多时间,而不只是”可能“节省更多时间)。
这一章的主旨是对Oracle中可用的索引提供一个概述,讨论什么时候以及在哪里可以使用索引。这 一章的风格和格式与本书其他章有所不同。索引是一个很宽泛的主题,光是介绍索引就可以单独写一本书, 其部分原因是:索引是开发人员和DBA角色之间的一个桥梁。一方面,开发人员必须了解索引,清楚如何 在应用中使用索引,而且知道何时使用索引(以及何时不使用索引)等。另一方面,DBA则要考虑索引的 增长、索引中存储空间的使用以及其他物理特性。我们将主要从应用角度来考虑,也就是从索引的实际使 用来介绍索引。这一章前半部分提供了一些基本知识。这一章的后半部分回答了关于索引的一些最常问到 的问题。
这一章中的各个例子分别需要不同的Oracle版本中的特性。如果每个例子需要Oracle企业版或个人 版的某些特性(而标准版中不支持),我会明确地指出来。