您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 自由空间表 >

堆组织表索引组织表和索引聚簇表

发布时间:2019-06-15 21:54 来源:未知 编辑:admin

  堆组织表就不说了,其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据

  而这个时候为了加快查询速度, 索引就出现了, 索引是针对少量特定字段的值拿出来进行排序存储, 并记录在表中的位置,

  而因为索引是有序的, 所以就会很容易通过索引查询到具体的记录位置, 然后再根据记录位置直接从表中读取该记录.

  从上面通过索引访问表记录的方式可以看出, 当要访问的数据量较大时, 通过每一条记录的位置去访问原始记录,

  每一条符合条件的记录都需要经过索引访问后再访问基表这样一个复杂的过程, 这会花费很多时间,

  同样, 如果不经过索引而直接查询表, 也可能因为表字段太多, 记录较大的情况下把全部的数据读取进来, 这也会花费很多时间.

  这个时候就会想到, 如果表中数据本身就是有序的, 这样查询表的时候就可以快速的找到符合条件的记录位置,

  而很容易判断符合条件记录的位置, 这样只需要读取一小部分数据出来就可以了, 不需要全表记录都读取出来进行判断.

  索引表就这样产生了.当然索引表中插入,更新资料的时候可能会因为需要排序而将数据重组, 这时候数据插入或更新速度会比堆组织表慢一些.

  我们可以看到堆组织表+索引的方式 与 索引表 都能够实现数据的快速查找, 那为什么不全部采用索引表呢, 这样不是很简单吗?

  Oracle中有很多类型的表,像堆组织表、索引组织表、索引聚簇表等等。首先,我将从最基本、最常用的堆组织表(heap organized table)介绍。

  通常我们默认建的表就是堆组织表。语法(详细语法请参见Oracle官方文档)如下:

  数据会以堆的方式管理,增加数据时,会使用段中找到的第一个能放下此数据的自由空间。当从表中删除数据时,则允许以后的INSERT和UPDATE重用这部分空间。它是以一种有些随即的方式使用。

  很多初学者会想当然的以为数据的插入会按顺序进行,第一条肯定排在第一位,接着是第二条,一直到最后。可当SELECT查询的时候,返回的结果往往让人失望。排列的顺序让人大跌眼镜,下面来看一个例子。

  全 表扫描时,会按命中的顺序来获取数据,而不是按插入的顺序。这是一个必要要了解的重要的数据库概念。一般来说,数据库表本质上是无序的数据组合。还有一种 情况,如果我插入一个小行,其后是一个非常大的行,而且这个大行与小行是无法放在同一个块上的,然后又插入一个小行,那么观察到的结果很可能是“小行,小行,大行”。

  索引组织表有一个可变的主B树存储组织。不象普通表(堆组织),数据是无序存储的集合。

  而iot 就是类似一个全是索引的表,表中的所有字段都放在索引上,所以就等于是约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。

  5、 经常用betweenand对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。

  经常更新的表当然不适合iot,因为oracle需要不断维护索引,而且由于字段多索引成本就大。****八楼的说的很对,因为索引组织的表数据所有字段都是根据索引组织的,因此每次插入都需要排序然后重新组织表结构,所以插入很慢,因此不适宜使用频繁改动的表(除非你希望每次插入都表根据索引键排序),但是由于数据全再索引上,因此索引已经将表排序好,所以访问的时候比较快(比访问普通索引快的原因是普通索引找到值后还要指向数据所在的块),并且,由于索引组织的表相同的索引键列中的内容放在一起,对于读取访问的块数也要少不少。

  索引是与表关联的可选结构.可以明确地创建索引,以加快对表执行SQL语句的速度.合理使用索引是减少磁盘I/O的主要方法.索引包括以下几种类型:

  2.唯一索引.主键上会自动创建唯一索引.唯一索引确保在定义索引的列中,表的任意两行的值都不相同.

  5.位图索引.使用位图索引的优点在于,它最适用于低基数列,也就是不同值的数目比表的行数少的列.如果某个列的值重复超过一百次,则可以考虑在该列上创建位图索引.

  为了方便操作,oracle提供了一个选项,可以基于一个或多个列上的函数或表达式创建索引.

  索引组织表与普通表不同之处在于,该表的数据存储在与其关联的索引中.对表数据进行的修改,如添加新行,更新新行或删除行,只会导致索引的更新.索引组织表最大的优点,提高读取速度,降低I/O读写.建立索引组织表必须有一列为主键.

  与对表进行分区类似,Oracle也允许对索引分区.与表分区一样,索引分区可以存储在不同的表空间中.索引分区有如下三种类型:

  局部分区索引是在分区表上创建的一种索引,在局部分区索引中,Oracle为表的每个分区建立一个独立的索引.

  全局分区是指在分区表或非分区表上创建的索引.全局索引的键可以引用存储在多个分区中的行.合璧索引是自己分区.

  此类型的表中,数据会以堆的方式进行管理,增加数据时候,会使用段中找到的第一个能放下

  此数据的自由空间。当从表中删除数据时候,则允许以后的UPDATE和INSERT重用这部分空间,

  很多初学者会想当然的以为数据的插入会按顺序进行,第一条肯定排在第一位,接着是第二条,一直到最后。

  可当SELECT查询的时候,返回的结果往往让人失望。排列的顺序让人大跌眼镜,下面来看一个例子。

  这是一个必要要了解的重要的数据库概念。一般来说,数据库表本质上是无序的数据组合。

  2. 索引组织表(index organized table, IOT):就是存储在一个索引结构中的表,数据按主键进行存储和排序。

  a.完全由主键组成的表。这样的表如果采用堆组织表,则表本身完全是多余的开销,

  b.代码查找表。如果你只会通过一个主键来访问一个表,这个表就非常适合实现为IOT.

  c.如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT就是一种合适的结构。 IOT提供如下的好处:

  如果经常在一个主键或唯一键上使用between查询,也是如此。如果数据有序地物理存储,就能提升这些查询的性能。

  聚簇是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中;聚簇还表示把相关的数据存储在同一个块上。

  利用聚簇,一个块可能包含多个表 的数据。概念上就是如果两个或多个表经常做链接操作,那么可以把需要的数据预先存储在一起。

  里面记录的是各个聚簇键。聚簇键和我们用得做多的索引键不一样,索引键指向的是一行数据,

  聚簇键指向的是一个ORACLE BLOCK。我们可以先通过以下命令创建一个索引簇。

  但是由于我们想同时创建和填充表,而有数据之前必须有一个聚簇索引,所以我们先来 建立聚簇索引。

  必须知道,索引聚簇会对DML的性能产生某种负面影响(特别是INSERT语句)。管理聚簇中的数据需要做更多的工作。

  2) 如果需要对聚簇中的表执行全表扫描:不只是必须对你的表中的数据执行全面扫描,

  还必须对(可能的)多个表中的数据进行全面扫描。由于需要扫描更多的数据, 所以全表扫描耗时更久。

  3) 如果你认为需要频繁地TRUNCATE和加载表:聚簇中的表不能截除。

  因此,如果数据主要用于读(这并不表示“从来不写”;聚簇表完全可以修改),

  heap table就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据可用空闲的空间来决定

  将索引和表数据一起存储在一个称为“索引组织的表”(Index-Organized Table, IOT)的表中。使用IOT可以显著地减少磁盘空间的使用,因为不需要存储索引的列两次(一次存在表中,一次存在索引中)。相反,只需将它们和其他任何非索引的列存储在IOT中一次。IOT适用于基本的访问方法是通过主键进行访问的那些表,但允许在IOT的其他列上创建索引以改善通过这些列的访问性能。由于IOT中的整个行存储为索引本身,因此没有用于每个行的ROWID。主键用来标识一个IOT中的行。与此不同,Oracle根据主键的值来创建逻辑ROWID,逻辑ROWID用于支持IOT上的二级索引。此外,还可以对IOT进行分区。对于频繁的插入操作的表。iot性能不好,在插入数据时,要寻找插入到那个块,若块的大小不足,需要放在溢出块中,这些操作都需要消耗资源。索引组织表适合于应用中更改不频繁,且访问时大多数时候按某一主键访问的字典。

  而iot就是类似一个全是索引的表,表中的所有字段都放在索引上,所以就等于是约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。

  因为索引组织的表数据所有字段都是根据索引组织的,因此每次插入都需要排序然后重新组织表结构,所以插入很慢,因此不适宜使用频繁改动的表(除非你希望每次插入都表根据索引键排序),但是由于数据全再索引上,因此索引已经将表排序好,所以访问的时候比较快(比访问普通索引快的原因是普通索引找到值后还要指向数据所在的块),并且,由于索引组织的表相同的索引键列中的内容放在一起,对于读取访问的块数也要少不少。

  当然索引组织表对全表扫描不排序没什么好处。对不按照索引键访问的表也没什么好处。

  5、经常用betweenand对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。

  经常更新的表当然不适合iot,因为oracle需要不断维护索引,而且由于字段多索引成本就大。

  索引组织表有一个可变的主B树存储组织。不象普通表(堆组织),数据是无序存储的集合。

  IOT有什么意义呢?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而IOT不存在主键的空间开销,因为索引就是数据,数据就是索引,二者已经合二为一。但是,IOT带来的好处并不止于节约了磁盘空间的占用,更重要的是大幅度降低了I/O,减少了访问缓冲区缓存(尽管从缓冲区缓存获取数据比从硬盘读要快得多,但缓冲区缓存并不免费,而且也绝对不是廉价的。每个缓冲区缓存获取都需要缓冲区缓存的多个闩,而闩是串行化设备,会限制应用的扩展能力)

  因为所有数据都放入索引,所以当表的数据量很大时,会降低索引组织表的查询性能。此时设置溢出段将主键和溢出数据分开来存储以提高效率。溢出段的设置有两种格式:

  PCTTHRESHOLDn:制定一个数据块的百分比,当行数据占用大小超出时,该行的列数据放入溢出段

  INCLUDINGcolumn_name:指定列之前的列都放入索引块,之后的列都放到溢出段

  ●如上例所示,name及之后的列必然被放入溢出列,而其他列根据PCTTHRESHOLD规则。

  与普通的索引一样,索引组织表也可以使用COMPRESS子句进行键压缩以消除重复值。

  表示对于每个主键组合都会物理地存储。倘若使用COMPRESSN则对于重复的列不再物理存储,

  ●要ALTER任何OVERVIEW的属性,都必须先定义overflow,若建表时没有可以新增

  下面分别就索引组织表和普通表的一些性能对比做一些试验,创建两张表,一个为普通的表,另外一个为索引组织表:

  上面模仿股票,分别存放股票代码,日期,收盘价格三个字段。下面,我们插入分别对这两个表插入1000种股票200天的数据,看看其插入数据时的性能:

  可以看到,插入20万条数据,普通表用了18秒,而IOT表用了31秒,相差明显。这说明插入数据时,IOT表的速度是相当慢的。

  逻辑读分别为259和63,差别显著!说明,查询时,IOT表性能要远远优越于普通的表!

  可以看到,删除数据时,普通表用了26秒,而IOT表用了8秒。差别显著!也许是普通表占的空间大的缘故吧!

  Oracle中聚簇是存储一组表的方法,而不是如同SQL Server、Sybase中那样(那是Oracle中的IOT)。概念上是通过聚簇码列将几张表“预连接”,尽可能将聚簇码列相同的几张表的行放入同一个块中。

  2.全扫描表的性能会受到影响不仅仅扫描一个表,而是对多个表全扫描;

  虽然普通的索引不保存空的键值,但cluster index保存空的keys?

  cluster在存储中,是多个表集合在一起存储的,也就是说多个表的数据存储在同一个block中。如果多个表中同时存在nullkey,是不是也需要把这些集中起来放在一起?你去观察一下?

  想到底是放null key呢还是不放nullkey好呢?根据cluster的特点,结合起来考虑考虑看看。

  其实,普通b-tree index也不是说就不能放nullkeys,只不过可能oracle认为大多数查询是等值或者范围查询,很少用isnull查询,并且如果表中存在大量的null的时候不存储null有利于减小索引大小提高性能。在各种因素权衡下选择了不存储null。

  概念类似索引聚簇表,但用散列函数代替了聚簇码索引。Oracle采用行的码值,使用内部函数或者自定义的函数进行散列运算,从而指定数据的存放位置。这样没有在表中增加传统的索引,因此不能Range Scan散列聚簇中的表,而只能全表扫描(除非单独建立索引)。

  索引聚簇需要空间时是动态分配,而散列聚簇表在创建时确定了散列码数(HASHKEY)。Oracle采用第一个不小于HASHKEY的质数作为散列码数,将散列码数*SIZE就得到分配的空间(字节),可容纳HASHKEYS/TRUNC(BLOCKSIZE/SIZE)字节的数据。

  性能上,散列聚簇表消耗较少I/O,较多CPU,所需执行时间较少,大体取决于CPU时间(当然可能要等待I/O,取决于配置)。

  1. 在一定程度上精确知道整个过程中表中记录行数或者合理的上限,以确定散列码数;

  2.不大量执行DML,尤其是插入。更新不会产生显著的额外开销,除非更新HASHKEY,这样会导致行迁移;

http://ericaravin.com/ziyoukongjianbiao/28.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有