oracle 表的类型、高水位线、PCTFREE、PCTUSED 簇表

1.了解PCTFREE、PCTUSED 、HWM

1.1 PCTFREE

  PCTFREE参数表示为一个块保留的空间百分比,即数据块在什么时候可被insert,默认是10。当数据块的可用空间低于10%后,数据块就不可以被insert,只能被update(因为update操作可能会对表中记录进行扩展,预留数据块空间可避免空间不足的情况);
  当一个block在达到pctfree之前,该block一直可以被插入。
  数据块处于上升期,考虑PCTFREE

1.2 PCTUSED

  PCTUSED指block的数据低于多少百分比时,又可以重新被insert,默认是40,即40%。
  数据块处于下降期,考虑PCTUSED

注: 如果表空间启用了ASSM(自动段存储管理),在建立表的时候,只能指定PCTFREE,否则可指定PCTFREE和PCTUSED

如图:
在这里插入图片描述
在这里插入图片描述
users表空间启动了自动段管理,只能指定PCTFREE;system表空间未启用,可指定PCTFREE和PCTUSED
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在users表空间
在这里插入图片描述

在这里插入图片描述
在system表空间
在这里插入图片描述

1.3 高水位线(high-water mark 即 HWM)

  高水位线类似于水文监测站里测水深度的标杆,当水上涨时,水位线随之上升,并在标杆上留下水印痕,即为高水位线。在数据库中,如果把表想象成一个平面结构或者从左到右依次排开的一系列块,高水位线就是包括了数据的最右边的块。
在这里插入图片描述
  删除表中的数据,可能会出现许多块不再包含数据,但仍处于HWM之下,而且会始终保持在HWM之下,注意:HWM永远不会下降,除非使用 rebuild、truncate或shrink(shrinking是10g的一个新特性,仅ASSM支持)
  HWM非常重要,因为oracle在全表扫描时会扫描HWM之下所有的块,即便其中不包括任何数据。这会影响full scan 的性能,特别是当HWM之下绝大多数块为空时。

2. oracle中各种类型的表

  普通表、分区表、索引组织表IOT、簇表、临时表、嵌套表、对象表

2.1 普通表

2.1.1 普通表扩展在tablespace中空间

创建表空间

create tablespace testdb datafile 'D:\software\oracle\oradata\orcl\testdb.dbf' size 20m autoextend on ;

在这里插入图片描述
创建表

create table t1(id int,name varchar2(10)) tablespace testdb;

给表分配空间(主动扩展一个表所占的空间)

alter table scott.t1 allocate extent (datafile 'D:\software\oracle\oradata\orcl\testdb.dbf' size 1m);

查看表在表空间中分配的空间

select * from dba_extents d where d.owner='SCOTT' and d.segment_name='T1';

在这里插入图片描述

2.1.2 移动表

从一个表空间移动到另一个表空间,可以清除表中的碎片

alter table t1 move [tablespace users];

  不添加表空间,则默认留在原来的表空间
优点:清除数据块中的碎片,降低高水位线
缺点:move过程中,表不能有应用增删改;move之后,表上的索引需要重建

 create table t2 tablespace testdb  as select * from dba_objects;

在这里插入图片描述
在这里插入图片描述

analyze table t2 compute statistics for table;
select * from user_tables u where u.table_name='T2';

在这里插入图片描述

删除一部分记录后

delete from t2 where rownum<50000;
commit;
analyze table t2 compute statistics for table;
select * from user_tables u where u.table_name='T2';

用户数据大幅度减少,高水位线没变
在这里插入图片描述

移动表:

alter table t2 move tablespace users;
analyze table t2 compute statistics for table;
select * from user_tables u where u.table_name='T2';

碎片被清除
在这里插入图片描述

2.1.3 收缩表shrink

  将数据行从一个数据块移动到另一个数据块,分为2个阶段:收缩、降低HWM:在收缩阶段,对表进行DML操作,在HWM阶段,不能对表进行DML操作;

alter table t2 shrink space [cascade];

前提:
表所在的表空间使用ASSM
表上启用了row movement

如:

在这里插入图片描述

alter table t2 enable row movement;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
收缩表

在这里插入图片描述
在这里插入图片描述

2.1.4 截断表

  truncate 将表中的记录删除,保留表的结构。释放表占用的所有数据块并把HWM调整到最低,而且不能回滚

2.2 IOT 索引组织表

  区别于普通表的无序组织方式,IOT(index organized table) 表必须有主键,是有序的表,其中的数据按照主键进行存储和排序;
  使用堆组织表时,必须为表和表主键上的索引分别留下空间。而IOT不存在主键的空间开销,因为IOT的数据存储在与其关联的索引中,索引就是数据,数据就是索引;
  IOT表中,表的数据存放在索引块中,所以如果通过主键索引访问表时,只需要读一个块即可。而如果通过主键索引访问普通表,至少需要读取2个块,一个是索引块,一个是数据块;

对于经常通过主键访问数据的表来说,适合使用IOT表

create table iot_student(sno int ,sname varchar2(100),constraint iot_pk p
mary key(sno) )organization index tablespace testdb  pctthreshold 50 overflow
blespace users ;

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

注:pctthreshold 制定一个数据块的百分比,当行数据占用大小超出时,该行的其他列数据放入溢出段,即overflow 指定存储空间中去,所以pctthreshold是保留在索引块里面的数据量占整个索引块的大小百分比,从0到50%,默认为50%

注:删除IOT表:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

清除回收站

purge recyclebin;

在这里插入图片描述

在这里插入图片描述

2.3 簇表

  2个互相关联的表的数据,同时放到一个簇数据块中,当以后进行关联读取时,只需要扫描一个数据块就可以了,极大提高效率;
  簇表分为索引簇表和哈希簇表

创建簇表的步骤:
  建立簇段 cluster segment
  基于簇,创建2个关联表,每个表都关联到cluster segment上
  为簇创建索引

create cluster clu1(code_key number);

在这里插入图片描述

create table student(sno number,sname varchar2(10)) cluster clu1(sno);

在这里插入图片描述

create table address(ano number,aname varchar2(10)) cluster clu1(ano);

在这里插入图片描述

create index index1 on cluster clu1;

在这里插入图片描述

通过sno=ano连接2个表查询速度非常快

查看簇信息

select  * from user_clusters;

在这里插入图片描述
查看表的列使用簇情况

 select * from user_clu_columns;

在这里插入图片描述

删除簇
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4 临时表 (每个session单独使用临时表)

   存放临时数据,可以使用临时表;临时表被每个session单独使用,即不同session看到的临时表中的数据可能不一样;
  如果退出session时删除临时表中的数据,可以使用 on commit preserve rows; 如果在用户commit或rollback时删除临时表中的数据,可以使用on commit delete rows;
  从v$sort_usage中可以查看正在使用临时表空间的session信息和SQL语句的id号,从v$sort_segment中查看临时表空间中的段的使用情况;
  临时表在临时表空间中保存

创建退出session时删除数据的临时表

create global temporary table tmp_student(sno int,sname varchar2(10)) on commit preserve rows

在这里插入图片描述

不同的会话对创建的临时表互不影响

在这里插入图片描述

退出会话,当前会话的数据被清除
在这里插入图片描述
退出之前的所有会话清空所有数据后才可以删除
在这里插入图片描述

在这里插入图片描述

创建用户commit或rollback时删除数据的临时表

create global temporary table tmp_student(sno int,sname varchar2(10)) on commit delete rows;

查看表:

select * from v$sort_usage;

在这里插入图片描述

select * from v$sort_segment;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值