重点 : 高水位线 / pctfree / pctused
一、表的类型: (11g中)
普通表(堆表) :我们最经常使用的 无特殊设置的表,数据存储时,行是无序的,对它的访问采用全表扫描。
分区表 : 对表进行分区,一是为了增大表所能容纳数据量,按照区来查询,可以提高查询速度,而不必进行全表扫描。
索引组织表IOT :有序的表,表中必须有主键,数据按照主键顺序进行存储
- create table tablename(……) organization index pctthreshold 大小 overflow 溢出段;
例如:pctthreshold 50 overflow tablespace users;行记录数大于数据索引块的50%,就把其多余的放入users表空间的其他位置。 - 1,区别于普通表的无序组织方式,IOT(Index Organized Table)表必须有主键,是有序的表,其中的数据按照主键进行存储和排序。
- 2,使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而IOT不存在主键的空间开销,因为IOT的数据存储在与其关联的索引中,索引就是数据,数据就是索引,二者
已经合二为一。 - 3,IOT表中,表的数据存放在索引块中,所以如果通过主键索引访问表时,只需要读取一个块即可。而如果通过主键索引访问普通表,至少需要读取两个块,一个是索引块、一个
是数据块。 - 4,对于经常通过主键访问数据的表来说,适合使用IOT表。
簇表 :如果经常要做的查询涉及两个表,而前两个表按照公共列相等的原则联合在一起的。
- 先创建一个簇 再在新创建表的时候指明该簇
create cluster cluster1 (code_key number); –(列名 类型)
create table t1 (sno1 number,sname1 varchar2()) cluster cluster1(sno1);
create table t2 (sno2 number,sname2 varchar2()) cluster cluster1(sno2);
临时表 :放在临时表空间中的表,在用户断开连接后,临时表中的数据会消失。临时表被每个session单独使用,不同session看到临时表中的内容不一样。
create global tempoary table 表名(…) 指定;
- 其中指定分为两种:
on commit preserve rows(退出session时删除表中数据)
on commit delete rows (用户发出commit/rollback命令时删除表中数据)
嵌套表、对象表等 :嵌套表-表中有表。 对象表:将对象数据类型插入到表中间。
二、高水位线 HWM(high-water-mark)
高水位线(high-water mark,HWM)高水位线是一个很有趣的概念,但是也是一个非常重要的概念。顾名思义,高水位线有点类型于水文监测站里测水深度的标杆一样,当水涨的时候,水位线随之上升,并在标杆留下一个水印痕,这个水印痕就是高水位线。
在数据库中,上述比喻很恰当。如果把表想象成一个平面结构,或者想象成从左到右依次排开的一系列块,高水位线就是包含了数据的最右边的块。
如图所示,一张表(一个长方形)中包含很多个数据块,在一开始的时候,表中没有存放数据,故高水位线在起始位置,然后在表中不断存放位置,高水位线随着存放数据的多少也在不断上涨,再次,用户对表中的数据进行了删除,而高水位线不会随之下降了,也就是历史使用数据块的最高位置,即就是高水位线。
记住:HWM永远不会下降,除非使用rebuild、truncated或shrunk这个对象
(shrinking是10g的一个新特性,仅ASSM支持)。
HWM很重要,因为Oracle在全表 扫描时会扫描HWM之下的所有块,即使其中不包括任何数据。这会影响full scan的性能,特别是当HWM之下的绝大多数块都为空
时。
二、PCTFREE (当用户在数据块中不断插入数据时,数据块至少要保留的空间)
如上图所示,pctfree=20,也就是说一张表上的最大存储数据量只占该表的80%,指定20%的free space 是因为用户可能在日后对表中的数据进行更新update操作是保留一定的富余空间。pctfree的默认值为10%。
三、PCTUSED (重启插入)
这个参数控制一个块什么时候被重新启用来插入数据,例如当一个块达到pctfree指定的利用率的时候,oracle停止向该块插入数据,但是后来发生一些删除操作,使得该块的利用率下降,当该块的利用率降到pctused以下的时候该块就被重新启用来插入数据了。
如果数据块的利用率低于PCTUSED指定的比率,那么用户重新可以进行insert操作。 PCTUSED默认为40%
- PCTFREE和PCTUSED的值可以在创建表时指定,也可以在创建表后用修改,但是要注意的是,修改后的值,只对修改后的数据操作有影响,对之前的无效。
- 如果一个表空间启用了ASSM,也就是自动段存储管理的属性值为AuTo
那么在建立表的时候只能指定PCTFREE. - 如果一个表空间未启用ASSM,也就是自动段存储管理的属性值为maunal,那么在建立表的时候既可以指定PCTFREE也可以指定PCTUSED 。
四、普通表的基本操作。
①扩展表空间 。
alter table tablename allocate extend (datafile ‘ 路径’ size 大小m)
②移动表move
alter table t1 move [tablespace 表空间名];
清除表中碎片,降低高水位线。不写移动位置仍为当前表空间。
③分析表
analyze table t2 computer statistics for table;
④收缩表
shrink 可以用来清除多余碎块,降低高水位线。
alter table t1 shrink space [cascade]
⑤截断表
删除表中所有记录,保留表结构,同时释放表中所有占用的数据块,降低高水位线到最低。
⑥删除表
drop table t1 [cascade constraints] [purge]
⑦删除列 (执行速度快)
alter table t1 set unused column tele; –先把一列弃用
alter table t1 drop unused column; –待oracle空闲时,可将已弃用的列删除。