oracle辅助表,oracle辅助索引(一)

在《顺序文件上的索引》中所描述的数据结构为主索引,因为它们决定了被索引记录的位置。它的数据文件是按查找键的值排序,由此能决定记录的位置。在以后将讨论另一种常用的主索引:散列表,其中查找键决定记录所属的“桶”。

辅助索引可用于任何索引目的:这种数据结构有助于查找给定一个或多个字段值的记录。但是,辅助索引与主索引最大的差别在于辅助索引不决定数据文件中记录的存放位置。而仅能告诉我们记录的当前存放位置,这一位置可能是由建立在其他某个字段上的主索引确定的。辅助索引和主索引的这一差别有一个有趣的推论:

谈论一个稀疏的辅助索引是毫无意义的。因为辅助索引不影响记录的存储位置,我们也就不能根据它来预测键值不在索引中显式指明的任何记录的位置。

因此,辅助索引总是稠密索引。

1、辅助索引的设计

辅助索引是稠密索引,且通常有重复值。如前所述,索引项由键-指针对组成,这里的“键”是查找键且不要求唯一。为了便于找到给定键值的所有索引项,索引文件中索引项按键值排序。

要是我们在这种结构上建立二级索引,那么这个二级索引将是稀疏的,其原因在《顺序文件上的索引》中已讨论过。

例4.13 图4-15所示为一个典型的辅助索引。与我们前面图示的准则一样:数据文件中每块存放两个记录。记录只显示了各自的查找键;其值为整型,而且像前面一样我们给它们取值为10的倍数。要注意,与4.1.5节数据文件不同的是,这里的数据没有按查找键排序。

fed2ef8781020a620edea498e35e1457.png

然而,索引文件中的键是排序的。这样就造成索引块中的指针并不是指向一个或少数几个连续存储块,而是指向许多不同的数据块。例如,为了检索键值为20的所有记录,不仅要查找两个索引块,而且还得访问指针指向的三个不同数据块。因此,查找同样数量的记录,使用辅助索引比使用主索引可能需要多得多的磁盘I/O。但是这个问题是无法解决的,我们无法控制数据块中的元组顺序,因为这些元组可能已按其他属性排序。

我们可以在图4-15所示的辅助索引上建立二级索引。这一级索引将是稀疏的,对应于每个索引块的第一个键值或第一个新出现的键值有一个键-指针对。

2、辅助索引的应用

除了能在被组织成顺序文件的关系(或类外延)上建立附加索引外,辅助索引甚至还用做某些数据结构的主键索引。这些结构之一就是“堆”结构。在这种结构中,关系的记录之间没有特定的顺序。

第二种需要辅助索引的常见数据结构是聚簇的文件。在这种结构中,两个或多个关系的元组被混在一起。下面的一个例子说明了这种组织结构在特定情况下存在的合理性。

例4.14 假设有两个关系,其数据模式可简要定义如下:

Movie(title,year,length,studioName)

Studio(name,address,president)

属性title和year一起组成关系Movie的键,而属性name是关系Studio的键。Movie中的属性studioName是参照Studio中的name的外键。进一步假定查询的常见形式如下:

select title,year

from Movie

where studiNname = 'zzz';

这里,zzz表示某一特定制片厂的名称,如,‘Disney’。

要是我们确信上面这类查询是典型的查询,那么就可不按主键title和year排序,而是按studioName来给元组排序。如4.1.5节讨论的那样,我们就在这个顺序文件上建立一个带重复键的主索引。这样做的好处在于当我们按给定的制片厂名称来查询电影时,可以在少数的几个,或者就比查找的记录所占最小存储块数多一个的存储块中找到所需记录。这使得该查询的磁盘I/O次数最少,使回答这种查询的效率极高。

但是,假如需要把电影的信息与制片厂的信息关联起来,仅按Movie的主键外的属性排序是没有帮助的。例如:

select title,year

from Movie,Studio

where title = 'Star Wars' AND

Movie.studioName = Studio.name

即:找出制作电影“StarWars”的制片厂的经理。又如:

select president

from Movie,Studio

where address LIKE '%Hollywood%' and

Movie.studioName = Studio.name

即:找出所有在Hollywood制作的电影。为了实现这些查询,我们需要把关系Movie和Studio进行连接。

如果我们确信关系Moive和Studio之间的基于制片厂名称的连接很常见,就可以采用一种聚簇的文件结构来使这些连接效率更高。在这种结构中,关系Movie的元组和关系Studio的元组存放在相同的一系列块中。说得具体些,我们在每个Studio的元组后面存放关系Movie中该制片厂的所有电影元组。其结构如图4-16所示。

573d886b15eafe9b3cf9660c763bc793.png

图4-16将制片厂及其制作的影片聚簇在一起的聚簇文件

现在,如果想找出制作某部电影的制片厂的经理,我们很有可能在同一存储块中找到该制片厂和它制作的电影的记录,这可以省去一个I/O步骤。要是想找出某个制片厂制作的全部电影,我们也会在相应电影制片厂的存储块中很容易地找出这些的电影,这也能节省I/O。

然而,为了高效地执行这些查询,我们需要有效地找到给定名称的电影或制片厂。因此,需要在Movie.title上建立辅助索引以查找给定电影名的一部电影(或多部电影,因为有可能存在多部同名的电影),而不管它们位于存放Moive和Studio元组的哪些块中。同样,为了查找给定制片厂名的Studio元组,我们也需要在Studio.name上建立辅助索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值