ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 浅谈ordinary table(普通表)和index-organized table(索引表)

浅谈ordinary table(普通表)和index-organized table(索引表)

原创 Linux操作系统 作者:icer_repls 时间:2011-05-16 12:53:08 0 删除 编辑
    tables are the basic unit of data storage in an  Oracle database,这是oracle官方对表的定义。接下来我将谈谈自己对ordinary table(普通表)和index-organized table(索引表)的理解。

    普通表也是我们平常用得最多的一种表,表里面的每行(row)都是按照我们起初插入数据的顺序一行接一行的存放在物理磁盘上(好像oracle中一般情况是每个oracle块(block)存放一行,具体参考官方文档oracle concept),如果我们没有在表上为相关的列建立索引的话,那么我们每次进行查询时将会扫描整个表,可想而知这种效率比较低,于是有了索引的出现。简单的说,索引就是为了加快查询效率而存在的。当我们在某些列上建立了索引之后,以后每次查询时我们便可根据系统维护的索引信息(这些索引信息维护着快速定位某一行具体在哪个数据块的信息)快速的访问到需要的行,从而减少了i/o次数,提高性能。那么在普通表中,这些索引信息是怎么维护的呢?在这之前我们需要了解一个概念 rowids ( ROWID datatype to store the address (rowid) of every row in the database)简单的说就是利用rowid来标识表中的行在磁盘上的哪个位置(详情参考oracle concept)。其中rowid分为physical rowids 和 logical rowids。其中物理rowid是用于普通表的,而逻辑rowid是用于非普通表,像索引表等等。 
    说了这么多,那么普通表到底是怎么维护这些索引信息的呢?索引的种类有很多,这里只谈B-tree(B树,不明白的看数据结构的相关书籍)B-tree是一种平衡树,所有的row信息都只存放在叶子结点,因为是利用B-tree存储,索引不仅树的高度(实际上就是我们查询数据所需要的i/o次数)比较低,而且每个查询的次数都比较稳定。那么每个结点是怎样保存这些row信息呢?我们可以粗略的这样表示,key就是这个行上索引列的值(也就是我这个结点里面不会存放非key列,这与后面讲的索引表不同),rowid就是这个行在磁盘上物理位置的相关信息。索引我们查询时,先利用索引定位到行在哪一块,然后读出需要的行。这其中表数据和索引数据是相互独立存储的。关于B-tree怎样去维护新插入的行或是删除的行这里不讨论了。
    而索引表就与普通表不同了,索引表也可以称为一种已经在物理磁盘上排序了的表(按照主键)。第一,其存储结构就是B-tree(注意普通表中的每行数据存储在磁盘上是无序的,有序的是其索引信息,这也间接的说明了索引和表中的数据是独立存储的)。其次,每个结点的信息也不同,在索引表中每个结点包含了每一行的全部列(普通表中不包含非key列),再次,在索引表中的rowid是逻辑的,为什么这里不能用物理rowid呢?因为我们经常要插入数据(插入一行),而插入数据必然会导致已经存在的行在块内,或是块间移动,如果是物理的,那么这个rowid就需要改变,这样便不妥。所以我们选用逻辑的rowid,逻辑rowid是基于主键的,我们可以利用逻辑的rowid来构建辅助索引。
    现在简单的总结一下普通表和索引表的区别:普通表里的数据本身是无序存放在磁盘上的,我们为了提高查询效率,在某些列上建立索引,也就是通过一种比较合适的数据结构来维护每个行的rowid(物理rowid)信息,当我们需要某列时,先查询索引找到rowid,然后通过rowid定位到具体的数据块。而在索引表中,表中的数据本身就是有序的存放的(按主键排序)。索引表的优势在于如果我们查询语句中的where子句中的信息就是主键,或是主键的一部分(valid prefix)那么我们将有相当高的查询效率,因为我们的表中的每行就是按照这个查询条件排序之后存放的,查询效果当然可想而知。
    这都是根据oracle concept理解而来的,如果不当,请指出^___^

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25701553/viewspace-695173/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-16

  • 博文量
    20
  • 访问量
    66471