目录

1.11g中表的类型:

2.高水位线HWM,(High Water Mark)

3.PCTFREE 和PCTUSED;

4. move、shrink、truncate来降低高水位线

5.IOT表、簇表、临时表


1.11g中表的类型:

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

分区表:为了提高容纳的数据量和查询速度把一个表分在多个区上。簇表:使联合查询时变得快。适用于频繁关联查询的表。嵌套表:表中有表,比如的表A中某行某列是表B的数据,像"盒子"一样的包含关系,就叫嵌套表。

2.高水位线HWM,(High Water Mark)

高水位线是指的是在 表中数据块的历史最大使用数量。高水位线一般是不会降低的。除非使用rebuild重建,truncated截断,shrunk收缩才会刷新高水位线。

全表扫描时,就是从表中的第0个数据块开始,一个数据块一个数据块的扫描到高水位线。也就是说,如果表中没有任何数据,也会要扫描到高水位线的数据块位置。

刚开始创建表是高水位线位于0号数据块位置,然后不断地插入数据,高水位线因此上升,然后把数据删除,高水位线依旧不变,如上图。

3.PCTFREE 和PCTUSED;

一个数据块大小默认为8KB,而PCTFREE(默认10%)指定了一个数据块中插入数据允许的最小空闲内存占比。而PCTUSED(默认40%)指定了一个数据块中允许重新插入数据的内存占比,单位为%。当往表中插入数据时,不会把数据块放满,因为这个空闲内存是为了给修改数据做准备的。加入insert数据块把数据块放满了后,再update数据内容,内容减小还好说,内容变多,当前数据块就没有可用的内存来给数据扩展了。数据块包含了3部分:数据块头(Header)、空闲内存(Free Space)、数据(DATA); PCTFREE控制着Free Space的最小值,超过则不准再插入,允许删除。PCTUSED控制着DATA的最小值,超过则恢复允许插入。不是说PCTFREE设了20%空间区域就永远大于20%,而是说空闲区域至少留20%将来给Oracle做数据扩展用的。一个数据块可以放表中的多个行数据。

结合上图所示。当一个数据块被启用时,数据块使用率从0%开始上升,未使用率从100%开始下降。假如PCTFREE设成20%,PCTUSED设成40%。由于刚开始数据块的使用率小于PCTUSED,所以允许往数据块中插入数据,直到未使用率达到FreeSpace变成了20%就不准在往此数据块中插入数据了,想要再往这个数据块中插入数据,就要把数据块使用率下降到PCTUSED 40%才被允许。

如果数据依旧超出了数据块总大小,将用行迁移的方式:Oracle会把原来数据块上的行数据头(Row-Header)保留,后面跟个C++一样的指针,把数据Data迁移到新的数据块上,让指针指向这数据。

数据块大小默认 8KB ,如果一个数据行大小超出了内存中最大可用的数据块大小,将会发生行链接:将一笔数据放入不同的数据块中,用指针的方式将同一笔数据关联起来。

如果表空间上指定了ASSM时,建表时只能指定PCTFREE。ASSM,自动段空间管理。MSSM,手动段空间管理。

查看是否段空间管理: select s.TABLESPACE_NAME,s.SEGMENT_SPACE_MANAGEMENT from dba_tablespaces s;

表空间扩展:alter table voapd.t1 allocate extent(datafile 'D:\ORACLE\ORADATA\ORCL\TESTTBS.DBF' size 1m);

4. move、shrink、truncate来降低高水位线

move 语句,将表中的数据移动到另一个表空间上,同时会清除表空间碎片和降低高水位线:

alter table [表名] move [tablespace USERS];

为了理解高水位线,首先创建一张表t2:

------之前创建了表空间 TESTTBS;
create table t2 tablespace TESTTBS as select * from dba_objects; --count(*)=72092

之后可以分析表中多少数据块

analyze table t2 compute statistics for table;
select table_name,blocks,num_rows from user_tables where table_name='T2';

然后再删除t2 数据表中3万行数据:

delete t2 where rownum < 30000;
commit;
analyze table t2 compute statistics for table;
select table_name,blocks,num_rows from user_tables where table_name='T2';

可以发现,数据行少了3万,但是占用的数据块却是没有变的。

用move对表的高水位线进行调整:

alter table t2 move tablespace USERS;
analyze table t2 compute statistics for table;
select table_name,blocks,num_rows from user_tables where table_name='T2';

可以看出,T2表中的高水位线被刷新了。但是使用move之时,表不能有其他应用,同时表上的索引也要重新建立。

用Shrink语句收缩表,将数据行的数据块移动到另外一个数据块上,是数据收缩,收缩完后降低高水位线。收缩时可以DML操作(增删改),降低高水位线时不准DML操作。使用Shrink语句的前提是:表所在的表空间启用了ASSM自动段管理,表上也启用了ROW MOVEMENT

select s.TABLESPACE_NAME,s.SEGMENT_SPACE_MANAGEMENT from dba_tablespaces s
select table_name,u.ROW_MOVEMENT from user_tables u where table_name='T2';
alter table t2 enable row movement;
alter table t2 shrink space;
analyze table t2 compute statistics for table;
select table_name,blocks,num_rows from user_tables where table_name='T2';
---

truncate table [表名]:保留表结构删除所有表数据,无法回滚。这个操作也可以把HWM降到最低。

当数据量过多时,删除表结构的速度会非常慢:可以先把改列设成unused,再把unused 的列给删除,这样删除列的操作就会在数据库空闲的时候自动完成。

alter table [表名] set unused column [列名];      alter table t2 drop unused columns;

5.IOT表、簇表、临时表

IOT 索引组织表:这个表必须有主键,会自动地按照主键进行排序,是个有序的表。与普通表不同,普通表和表主键上的索引都会需要为它们留出存储空间,而IOT不存在主键的空间开销。索引(主键)是存放在一起的;数据存储在索引块中;所以经常通过主键来访问数据的话,IOT表更适合;

create table student_iot(sno int,sname varchar2(20),sage int , constraints pk_student primary key(sno)
)
organization index
pctthreshold 30 overflow tablespace users; --指定阈值30%,当一行记录太大超出了数据索引块的30%,其他列(sname 、sage)就会放到指定的表空间里users

删除索引表的溢出表,首先要先删除索引表,然后清空回收站,命令 : purge recyclebin;

簇表:两个相互关联的表数据,同时放到一个数据块中。这样关联查询时,就只有扫描1个数据块就行。

创建簇表步骤如下:簇的数据类型要和表字段的数据类型一致。

----1.创建簇-----
create cluster cluster1(ckey int);
----2.创建表时关联簇---------
create table student_cluster(sno int ,sname varchar2(20),sage int )cluster cluster1(sno);
----3.创建另一张表时关联簇---------
create table record_cluster(sno int ,record int )cluster cluster1(sno);
----4.簇上要建立索引-------create index index1 on cluster cluster1;select * from user_clusters;  --查询簇的信息select * from user_clu_columns;  --查询簇的关联信息----------5删除簇要先把簇表删除-----------drop table student_cluster;drop table record_cluster;drop cluster cluster1;

临时表:临时表的创建必定在临时表空间 TEMP,临时表数据只能在同一个session中看到,数据不被不同session所共享。每个session的临时表中的数据是完全独立的;

创建临时表语法如下:

create global temporary table student_temp(sno int ,sname varchar2(20),sage int ) --on commit delete rows --(默认值);on commit preserve rows;

其中 on commit delete rows; 指明了当事物提交或回滚时,自动把临时表数据清除; on commit Preserve rows 指明了当Session 断开和数据库连接时才会删除临时表中的数据;

由图可以知道,两个Session 中的临时表是完全独立的,互不干扰,尽管用户都是相同的。指定 on commit preserve rows;的临时表 ,其中的数据不会因为commit而被清空。然而用户断开连接时,临时表中数据才会删除。

drop 掉临时表的前提是,所有使用这临时表的session中表内不准有数据。

当采用on commit delete rows创建临时表时,一提交数据,表中的数据就被清空

查询临时表信息:

 select u.TABLE_NAME as 表名,u.TEMPORARY as 是否是临时表,u.DURATION as 是否是事务型的建表方式from user_tables u  where  u.TABLE_NAME='STUDENT_TEMP';

Oracle 原理:高水位线、PCTFREE、PCTUSED、索引组织表、簇表、临时表相关推荐

  1. 浅析ORACLE数据库高水位线(high water mark)

    ORACLE数据库逻辑结构包括:数据库块(block),扩展(extent 区),段(segment),表空间(tablespace).高水位线就存在于段(segment)中,它用于标识段中已使用过的 ...

  2. oracle高水位线

    ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数 ...

  3. oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM

    概述 深入理解HWM对于做数据库优化是必须掌握的一个基础,很多时候我们以为删了数据后表应该会快很多,但是得到的结果却很不理想,这其中就涉及到HWM方面了,也是truncate和delete不同的地方. ...

  4. 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线...

    一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...

  5. oracle高水位线以及pctfree、pctused

    一.oracle 高水位线详解 一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内 ...

  6. oracle索引组织表(Index Organizied Table)

    索引组织表(index organized table, IOT)就是存储在一个索引结构中的表.存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储 ...

  7. oracle 高水位线回收,回收高水位线

    这里简单地讲述回收表的高水位,从表对应的段包含的块数的变化,间接地表现出高水位线 对表记录检索的影响.在这个表高水位回收的测试中,也顺便验证了表中的索引在回收高水位的过程中 并没有发生失效.还有就是在 ...

  8. oracle高压水位线,Oracle 高水位线详解(HWM)

    HWM:高水位线, 可用空间与已用空间的分界线,标记着段空间使用情况. 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上 ...

  9. oracle 判断高水位,修正ORACLE表的高水位线HWM

    HWM 全名HIGH WATER MARK 在ORACLE中,执行对表的删除操作不会降低该表的高水位线.而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块.如果在执行删除操作后不降低 ...

最新文章

  1. 5. 编程规范和编程安全指南--JavaScript
  2. 解读《这就是 OKR》 | OKR 的四大价值
  3. Vue学习小札——2.6 组件参数校验与非props特性
  4. (译)Web地图设计模式——ArcGIS Server
  5. TikTok英国市场你不能不知道的10大数据
  6. 玩cf出现outofmemory_《穿越火线》的肖枫原型是CF选手白鲨吗?
  7. HTML元素水平居中和垂直居中
  8. JavaScript响应键盘不再用KeyboardEvent.keyCode,而是用keyboardEvent.code
  9. 你真的知道 == 和 equals 的区别吗?
  10. creportctrl 排序_witclient 智能客户端
  11. 产生随机小数_如果取到小数区间内的任一数字?
  12. etcd工作原理和部署指南
  13. 在字符串中查找id值MySQL
  14. ctype函数_Ctype函数简介
  15. 计算机自我鉴定范文7月,学员自我鉴定表7篇
  16. 按键精灵设置脚本过期日期
  17. Html+JavaScript猜数字游戏
  18. 2018-2019-2 20175217 实验四《Android开发基础》实验报告
  19. 巴马冷泉、巴马水到底是个什么?有市场吗?
  20. apple关闭双重验证_Apple安全浏览说明-Apple为什么将您的数据发送给Google和腾讯,以及如何将其关闭

热门文章

  1. Mac下安装Mysql以及修改Mysql密码
  2. Javascript获取数组中的最大值和最小值方法汇总
  3. C#语言和SQL Server 数据库处理
  4. 在灾难发生之时,你在Facebook的社交定位或许能救你一命
  5. Nginx的页面中文乱码解决方法
  6. 使用jQuery操作Cookies的实现代码
  7. spring tx:advice 和 aop:config 配置事务
  8. Linux学习之033_2
  9. ci 框架插入时返回插入的id号
  10. 改变Linux工作环境中的提示信息