文章目录
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;