设为首页 收藏本站
查看: 906|回复: 0

[经验分享] oracle辅助索引(二)

[复制链接]

尚未签到

发表于 2018-9-14 07:00:18 | 显示全部楼层 |阅读模式
  3、辅助索引中的间接
  图4-15所示结构存在空间浪费,有时浪费很大。假如某个索引键值在数据文件中出现n次,那么这个键值在索引文件中就要写n次,如果我们只为指向该键值的所有指针存储一次键值,这样就会比较好。
  避免键值重复的一种简便方法是使用一个称为桶的间接层,它介于辅助索引文件和数据文件之间。如图4-17所示,每个查找键K有一个键-指针对,指针指向一个桶文件,该文件中存放K的桶。从这个位置开始,直到索引指向的下一个位置,其间指针指向索引键值为K的所有记录。
  例4.15 例如在图4-17的索引文件中,沿索引键为50的索引项指针找到中间“桶”文件。这一指针刚好将我们带到桶文件中第一个块的最后一个指针。继续向前查找,找到下一块的第一个指针。因为索引文件中键值为60的索引项指针刚好指向桶文件的第二个块的第二个指针,所以我们停止查找。
  在图4-17所示的方式中,只要查找键值的存储空间比指针大就可以节省空间。不过,即使在键值和指针大小相当的情况下,在辅助索引上使用间接也有一个重要的好处:我们通常可以在不访问数据文件记录的前提下利用桶的指针来帮助回答一些查询。特别是,当查询有多个条件,而每个条件都有一个可用的辅助索引时,我们可以通过在主存中将指针集合求交来找到满足所有条件的指针,然后只需要检索交集中指针指向的记录。这样,我们就节省了检索满足部分条件而非所有条件的记录所需的I/O开销。
DSC0000.jpg

  例4.16 考虑例4.14中的关系
  Movie(title,year,length,stadioName)
  假定我们在studioName和year上都建立了有间接桶的辅助索引,而且我们要执行如下查询:

  select>  from Movie
  where studioName = 'Disney' and
  year = 1995;
  即:找出Disney在1995年制作的所有电影。
  图4-18说明了如何使用索引来回答这个查询。通过studioName上的索引,我们找出了所有指向Disney制作的电影的指针。但是,我们并不把这些记录从磁盘上取到主存中,而是通过year上的索引,再找出所有指向1995年制作的电影的指针。然后我们求两个指针集的交集,正好得到1995年Disney制作的所有电影。现在我们到磁盘上去检索所有包含一部或几部这样的电影的块,这样只需检索尽可能少的数据块。
DSC0001.jpg

  4、文档检索和倒排索引
  多年来,信息检索界都在处理文档的存储和按关键字集高效检索文档的问题。随着WWW的出现以及在线保存所有文档成为可能,基于关键字的文档检索已成为数据库最大的难题之一。
  尽管可用来找出相关的文档的查询有许多种,但最简单、最常见的形式可用关系的术语描述为:
  (1)一个文档可被看成是关系Doc的元组。这个关系有很多属性,每个属性对应于文档可能出现的一个词。每个属性都是布尔型—表明该词在该文档出现还是没有出现。因此,这一
  关系模式可以被看作:
  Doc(hascat,hasDog,)
  其中hascat取值为真当且仅当该文档中至少出现一次“cat”这个词。
  (2)关系Doc的每个属性上都建有辅助索引。不过,我们不必费心为属性值为FALSE的元组建索引项;相反,索引只会将我们带到出现该词的那些文档,即,索引中只有查找键值为TRUE的索引项。
  (3)我们不是给每个属性(即每个词)建立一个单独的索引,而是把所有的索引合成一个,称为倒排索引。这个索引使用间接桶来提高空间利用率,正如4.2.3节中讨论的那样。
  例4.17 图4-19所示为一个倒排索引。取代记录数据文件的是一个文档集合,每个文档可以被存放在一个或多个磁盘块上。倒排索引本身由一系列词-指针对组成;词实际上是索引的查找键。正如到目前为止讨论的任何一种索引那样,倒排索引被存储在连续的块中。不过,在一些文档检索应用中,数据的变化不像典型数据库中那样频繁,因而通常也就不用提供应付块溢出或索引变化的措施。
DSC0002.jpg

  指针指向“桶”文件中的位置。例如,在图4-19中,“cat”一词有一个指针指向桶文件。该指针在桶文件中指明的位置之后是所有包含“cat”的文档的指针。图中给出了一些这样的指针。类似地,图中“dog”一词的指针指向一个指针列表,该列表中的指针指向包含“dog”的所有文档。
  桶文件中的指针可以是:
  1)指向文档本身的指针。
  2)指向词的某一次出现的指针。在这种情况下,指针可以是由文档的第一个块和一个表示该词在文档中出现次数的整数构成的对。
  一旦有了使用这种由指向词的每次出现的指针桶的想法,我们可能就会想扩展这个想法,使桶数组包含更多有关词的出现的信息。这样,桶文件本身就成了有重要结构的记录集合。这种做法的早期应用是区分一个词出现在文档的题目、摘要,还是正文中。随着Web上文档的增长,尤其是使用HTML、XML或其他标记语言的文档的增长,我们也可以指明与词关联的标记。例如,我们不仅可以区分出现在题头、表或锚中的词,而且可以区分以不同字体和字号出现的词。
  ========================对信息检索的进一步讨论============================
  有很多技术可用于改进基于关键字的文档检索效率。完整介绍这些技术已超出本书的范围,这里介绍两种有用的技术:
  1)抽取词干。在将单词的出现放入索引中之前。我们删除词的后缀以找出它的“词干”。例如,复数名词可被当作其单数形式处理。因此,例4.17中的倒排索引显然使用了抽取词干技术,因为搜索“dog”一词时我们不仅得到“dog”的文档,而且得到一个有单词“dogs”的文档。
  2)无用词。像“the”、“and”之类最常用的词称为无用词,通常不包含在倒排索引中。原因在于好几百个常用词出现在太多的文档中,以至于它根本无益于检索特定主题。去除无用词还可以明显地缩小索引。
  ============================================================================
  例4.18 图4-20所示为一个标明HTML文档中词的出现情况的桶文件。如果有出现类型即标记的,就在第一列指明。第二、第三列一起构成指针指向词的出现。第三列指明文档,而第二列给出了该文档中该词出现的次数。
DSC0003.jpg

  可以用这种数据结构来回答关于文档的各种查询,而且不用仔细查看文档。例如,假设我们想找出有关狗的,并将狗与猫做了比较的文档;没有深刻理解文档的内容,我们就无法准确地回答这个查询。但是,要是查找符合以下条件的文档,我们可以获得一个很好的提示:
  a)在标题(title)中提到狗,且
  b)在某个锚中提到猫—该锚可能是连到一个关于猫的文档的链接。
  ==================================桶中的插入与删除==============================
  在一些图如图4-19中,我们所给的桶是大小适中的紧凑数给。实际上,它们是单个字段指针)的记录,且像其他任何记录集合一样存放在块中。因此在插入和删除指针时,我们可用到目前为止学过的任一种技术,例如为文件的扩充预留空闲空间、溢出块和可能的块内或块间记录移动。在后一种情况下,当我们移动例排索引的桶中指针指向的记录时,必须小心地改变从倒排索引到桶文件中的相应指针。
  ===============================================================================
  我们可用通过对指针求交来回答这个查询。也就是说,按对应于“cat”的指针找到这一单词的所有出现。我们从桶文件中选择有“cat”出现且类型为“锚”的文档指针。接着,我们找到“dog”的桶中项目,并从中选择类型为“标题”的文档指针。如果把这两个指针集相交,就得到符合在标题中提到“dog”且在某个锚中提到“cat”这一条件的文档.
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581459-1-1.html 上篇帖子: oracle辅助索引(一) 下篇帖子: SQL及Oracle和MySQL的数据类型详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表