oracle high watermark,高水位HighWaterMark的概念及高水位问题的解决.doc

高水位(High Water Mark)的概念及高水位问题的解决

1、?准备知识-oracle的逻辑存储结构:表空间——>段——>区——>块

块(block):是粒度最小的存储单位,现在标准的块大小是8K,有参数DB_BLOCK_SIZE指定。 HYPERLINK "javascript:;" \t "_self" ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行。

SQL> show parameter db_block_size

NAME???????????????? TYPE??????? VALUE

------------------ ----------- -------

db_block_size?????? integer???? 8192

区(extent):由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表A时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到A,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给A,而不是多少个块。一个extent包含多少个block是由创建表空间时指定的,类似:extent management local uniform size 1m。默认情况下一个extent对应8个block,即64k。

?

段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据。

表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个 HYPERLINK "javascript:;" \t "_self" 数据库至少要有一个表空间。

2、?高水位(High Water Mark)的概念:

所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为"High Water Mark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。

实际环境中随着我们表中数据的不断增长,表的高水位也被不断的推高。当高水位达到一定程度之后,会对该表上的 HYPERLINK "javascript:;" \t "_self" SQL查询效率产生负面影响,因此需要采取有效措施降低高水位。

???考虑让我们有一个段,如一张表,其中填满了块,如图1所示。在正常操作过程中,删除了一些行,如图2所示。现有就有了许多浪费的空间:(1)在表的上一个末端和现有的块之间,以及(2)在块内部,其中还有一些没有删除的行。

图1:分配给该表的块。用灰色正方形表示行。

图2:行后面的块已经删除了;HWM仍保持不变。

??????Oracle不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记(HWM),如图2所示。但是,这种方法有两个主要的问题:

(1)当用户发出一个全表扫描时,Oracle始终必须从段一直扫描到HWM,即使它什么也没有发现。该任务延长了全表扫描的时间,即降低了sql的性能。

(2)当用直接路径插入行时 — 例如,通过直接加载插入(用APPEND提示插入)或通过SQL*Loader直接路径 — 数据块直接置于HWM之上,即它下面的空间就浪费了。

3、解决HWM的问题:

3.1、解决HWM带来的性能问题:

?我们知道truncate table会重置HWM,但是truncate会删除所有数据,如果如上面图2所示,表中有大量的碎片该怎么处理呢,我们来模拟这个例子,

SQL> create tablespace test datafile '/paic/g4cs2021/stg/sx/oradata/ls17xa/test01.dbf' size500mautoextend off extent management local uniform. size1msegment space management auto ;

Tablespace created

SQL> create table testhw(name varchar2(100),id number ) tablespace test;

Table created

SQL> select segment_name,header_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值