ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle的一些基本概念

oracle的一些基本概念

原创 Linux操作系统 作者:hegenhua 时间:2011-02-18 15:42:42 0 删除 编辑

概念:以下因为定义摘自,个人觉得比较权威.

A table whose physical storage is organized like an index. Unlike a regular
table, where rows are inserted in no particular order and querying all rows
will retrieve the data in random order, index-organized tables store data
organized according to the primary key defined on the table. The difference
between a table (referred to as storing data on a heap) and an indexorganized
table is like the difference between storing all of your receipts in
a shoebox (i.e., in no specific order) and storing it chronologically according
to the date the expense was incurred. Taking the receipts out of the shoebox
will result in no specific logic in their retrieval, while doing the same when the
receipts are organized chronologically will allow you to predict that the June 2
receipt will appear before the August 1 receipt.

翻译过来貌似是(本人英语属于半桶水,翻译不好敬请丢砖:)):

  索引组织表就是其物理存储结构被组织得像索引一样.

常规表的数据行在插入的时候不会被指定特定的存放位置,并且在查询行的时候数据将以随机顺序返回,与常规表不同,索引组织表(IOT)的数据是根据定义在表上的主键加以存储的.因此,常规表(堆表)和IOT之间的不同点就象把收条随手丢到盒子里(你管他啥盒子呢)与把收条按费用的发生日期存放之间的不同点. 因此,从盒子里取出的收条是无序的(如果你人品爆发,所有收条自己已经排好序,那我就... ...,我不考虑这种特殊情况). 而以费用发生日期事先就排好顺序的收条,在取出时,我们可以预言,6月2号的收条是排在8月1号发生的收条之前的(不一定吧,如果是2009年的8月1号和2010年的6月2号呢,哈哈,开个玩笑).

oracle IOT与ms sql server的clustered 表的异同:

   二者之间有类似的地方,也有不同之处.

不同点:

     IOT需要基于表的主键,也就是说,没有主键的表不能被定义为IOT.而MS sql server的clustered table没有这个限制,clustered index可以建在PK上,也可以建在非PK字段(字段集)上.

相同点:

    二者都是以index的形式存放数据的,查询效率一般比heap表效率高,原因大家都知道,DISK的顺序读要比随机读来的快. 但是做insert时,效率就要比heap表要慢了.原因嘛,大家拿张发票做如下实验:

    1,随手把发票丢到抽屉里;

   2,把发票按日期顺序排放好.

大家做完这个实验后,就知道哪个方便,哪个快了,是方法1快是不是.

数据库在插入记录时也有类似的道理,而且数据库还存在块(sql server和oracle都有块的概念,当然,sql server叫page,oracle叫data block),而每一个块其尺寸是有一定限度的,page是8KB,data block可以是2KB,4KB,8KB,16KB等,也就是一个块里放的记录条数是有限的.想象一下,对于一个heap表,来了一条新记录,因为是随机的,所以RDBMS只需要随机给新记录找个坑放好就行,而对于IOT和Clustered table可没这么方便,因为是物理上有序的,为了保证物理上有序,新的记录必须被存放到特定位置,比如,6月2号的记录就必须存放到6月3号之前(假设表是基于这个日期字段物理存放的),更有甚的是,如果找到的可以存放记录的块已经满了,没有足够空间来存放新记录,那么RDBMS还得分配新的数据块,调整指针等操作.   虽然IOT和clustered table在插入新记录时效率较heap差,但是查询(找数据)的时候就快很多,原因还是,DISK的顺序读比随即读快,并且RDBMS知道6月2号的发票肯定放在6月3号和6月1号之间,这样,找到了6月2号也就等同于找到了记录本身,当然快了(这里假定每天只有一张发票).

 

索引组织表(IOT)和普通的堆组织表的区别:

索引组织表(IOT)有一种类B树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而IOT中的数据是按主键有序的存储在B树索引结构中。与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值。

如下图所示,在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,Oracle会有对应的索引与之对应,且分开存储。换句话说,IOT即是索引,又是实际的数据。

                               普通表索引与表数据的对应关系
        
                            IOT的索引项和表数据的对应关系

IOT和普通表对于应用程序来说,例如sql查询语句,是没有区别的。也就是说oracle中对表的组织形式对应用来说是透明的。
       下表总结了IOT与一般表的区别:
 
普通表 IOT
ROWID唯一确定一行录 主键唯一确定一行记录
可以不指定主键 必须指定主键
ROWID伪列中保存物理rowid,可以构建二级索引 ROWID伪列中保存逻辑rowid,可以构建二级索引
基于rowid进行访问 基于逻辑rowid进行访问
顺序扫描才能得到所有行 只须扫描索引即可返回所有行
可以和其它表一起聚集存储 不能存储为聚集表
可以包含long和lob类型的列 可以包含lob类型但不可以包括long类型的列


使用IOT的好处:
1、由于索引项和数据存储在一起,所以无论是基于主键的等值查询还是范围查询都能大大节省磁盘访问时间。
2、为了能够更快地访问那些频繁访问的列,可以使用溢出存储选项将那些访问不频繁的列放在B树叶结点数据块之外的溢出堆空间中。这样一来便可以得到更小的B树,以及包含更多行的叶结点
3、和堆组织表和索引不同,主键不需要被存储两次。
4、ROWID伪列是基于主键值的逻辑rowid,而不是物理rowid,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。

注:
1、Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对象,Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition;Logical rowids :存储IOT的行地址
2、每个表在oracle内部都有一个ROWID伪列,它在所有sql中无法显示,不占存储空间;它用于从表中查询行的地址或者在where中进行参照,一个例子如下:
    SELECT ROWID, last_name FROM employees;          Oracle内部使用保留在ROWID伪列中的值构建索引结构,rowid伪列不存储在数据库中,它不是数据库表的数据,(从database及table的逻辑结构来说)。事实上,在物理结构上,每行由一个或多个row pieces组成,每个row piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的.
3、二级索引:也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。
资料引用:http://www.knowsky.com/539480.html

 

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

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

注册时间:2011-02-17

  • 博文量
    24
  • 访问量
    52852