HWM是数据段中使用空间和未使用空间之间的界限,假如现有自由链表上的数据块不能满足需求,Oracle把HWM指向的数据块加入到自由链表上,HWM向前移动到下一个数据块。简单说,一个数据段中,HWM左边是使用的数据块,右边是目前还没有被使用的数据块。

一个表在表空间中创建以后,会先分配一些初始的数据区。随着表中行数的增加,区也会相应的扩展,DBA_SEGMENTS试图的BLOCKS和EXTENTS列记录了相应的数据区块的信息。

SQL> create table test(id number);

Table created.

SQL> select blocks, extents from dba_segments where segment_name='TEST' and owner='HR';

BLOCKS EXTENTS
---------- ----------
8 1

现在对表进行分析,以查看HWM。

SQL> analyze table test compute statistics;

Table analyzed.

SQL> select blocks, empty_blocks, num_rows from dba_tables where table_name='TEST' and wner='HR';

BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
0 8 0

现在我们往表中插入一些数据,再来查看HWM。

SQL> insert into test select object_id from user_objects;

142 rows created.

SQL> commit;

Commit complete.

SQL> analyze table test compute statistics;

Table analyzed.

SQL> select blocks, empty_blocks, num_rows from dba_tables where table_name='TEST' and wner='HR';

BLOCKS EMPTY_BLOCKS NUM_ROWS
---------- ------------ ----------
5 3 142

可以看出此时的HWM应该在blocks=6的位置,虽然这里分配了5个数据块,但数据不一定占据了5个块的位置。

要想获取该表使用的确切的数据块,可以使用下面的查询。

SQL> select count(distinct dbms_rowid.rowid_block_number(rowid)||'-'||
dbms_rowid.rowid_relative_fno(rowid)) used_blocks
from test;

used blocks
-----------
1

从这里可以看出test表占用了8个数据块,有5个被格式化以准备接收数据,但实际存储数据的只有一个数据块。

我们把这几个块导出来查看一下。

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from test;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
4 4348

SQL> alter system dump datafile 4 block min 4348 block max 4350;

System altered.

相应的trace文件中,可以发现下面的信息。

data_block_dump,data header at 0xeb19464
===============
tsiz: 0x1f98
hsiz: 0x12e
pbl: 0x0eb19464
bdba: 0x010010fc
76543210
flag=--------
ntab=1
nrow=142

......

data_block_dump,data header at 0xeb19464
===============
tsiz: 0x1f98
hsiz: 0xe
pbl: 0x0eb19464
bdba: 0x010010fe
76543210
flag=--------
ntab=0
nrow=0

可以看到,142行只存在于 bdba: 0x010010fc 这个块中,也就是datafile=4,block=4348的数据块。

说到HWM就不能不提如何的降低一个表的HWM,因为如果一个表插入了大量的数据然后又被删除其中的一部分,表的HWM是不会下降的。在全表扫描的时候仍然会扫描到HWM的位置,这样必然导致IO资源的浪费。

删除记录不会降低HWM,因此,删除记录不会导致EMPTY_BLOCKS块的增加,即使使用'alter table test deallocate unused;'命令也不行。改变表的HWM可以使用truncate table test;和alter table test move tablespace xxx;等方法。当然,10g中也可以使用alter table test shrink space;。

现在使用具体的实例来说明各种方法对HWM的影响。

首先采用移动表空间的方法。

SQL> create table t(a number, b number, c number, d number, e number, f number);

Table created.

SQL> create or replace procedure populate (numrows in number) is
fa number; fb number; fc number; fd number; fe number; ff number;
begin
dbms_random.Initialize(1234567);
for i in 1..numrows loop
fa:=mod(abs(dbms_random.random),10)+1991;
fb:=mod(abs(dbms_random.random),2);
fc:=mod(abs(dbms_random.random),20);
fd:=mod(abs(dbms_random.random),30);
fe:=mod(abs(dbms_random.random),40);
ff:=mod(abs(dbms_random.random),10);
insert into t values(fa,fb,fc,fd,fe,ff);
if mod(i,100)=0 then commit; end if;
end loop;
dbms_random.Terminate;
end;
/

Procedure created.

SQL> set serveroutput on
SQL> execute populate(200000);

PL/SQL procedure successfully completed.

SQL> delete from t where a=1991 and b=0;

9991 rows deleted.

SQL> commit;

Commit complete.

SQL> delete from t where f=9;

13911 rows deleted.

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select num_rows,blocks,empty_blocks from dba_tables where table_name='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
171270 684 84

SQL> alter table t move tablespace users;

Table altered.

SQL> select num_rows,blocks,empty_blocks from dba_tables where table_name='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
171270 684 84

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select num_rows,blocks,empty_blocks from dba_tables where table_name='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
171270 569 71

可以看到,重新分析后,表的HWM下降了。说明移动表空间的方法是可以降低HWM的,即使移动前后的表空间是相同的。

接下来,再来看看export/import对HWM的影响。

首先导出T表中的所有数据,

$ exp hr/hr tables='t'

......
About to export specified tables via Conventional Path ...
. . exporting table T 171270 rows exported

SQL> delete from t;

171270 rows deleted.

SQL> commit;

Commit complete.

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select num_rows, blocks, empty_blocks from dba_tables where table_name='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 569 71 --虽然行数变了,但是HWM仍然没有改变

$ imp hr/hr ignore=y file=expdat.dmp full=y

......

. importing HR's objects into HR
. . importing table "T" 171270 rows imported

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select num_rows, blocks, empty_blocks from dba_tables where table_name='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
171270 569 71

可以看出import之后,表的HWM没有改变。

HWM的实验的更多相关文章

  1. MOVE降低高水位 HWM

    MOVE降低高水位 HWM --创建实验表空间SQL> create tablespace andy03 datafile '/home/oracle/app/oradata/orcl/andy ...

  2. Oracle中HWM与数据库性能的探讨

    Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...

  3. Oracle中 HWM与数据库性能的探讨

    链接:http://www.eygle.com/archives/2011/11/oracle_hwm_tuning.html 本文讨论的是oracle中关于table的HWM的内容,主要包括这样几个 ...

  4. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  5. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  6. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

  7. 物联网实验4 alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  8. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)

    一.  HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...

  9. (原创) alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

随机推荐

  1. [转]GLES 3.0 新特性

    转自: http://www.ifanr.com/131333 OpenGL ES 3.0 带来很多新特性,根据 AnandTech 的解释: 支持更多缓冲区对象.在 OpenGL ES 2.0 时中 ...

  2. Unity3D TestTool Part _1

    一直想看看Unity3d官方推出的UnityTestTools的测试插件,今天有空尝试了一下. 一.Quick Start 1. create a plane position which trans ...

  3. 去除List集合中的重复对象,Map遍历代码

    /*** * 去除List<PartsInfoDTO>列表中的重复对象 ~!! * @param list * @return */ public static List<Parts ...

  4. 关于DotNetBar中DataGridViewX 自动全屏 Anchor属性无效问题

    由于在DataGridViewX 中使用了控件DataGridViewCheckBoxXColumn会导致 Anchor属性无效问题化,具体原因未知,建议改换为系统自带的DataGridViewChe ...

  5. Openflow的转发与传统的转发区别和优势

    来源:(SDN QQ群语录20130819) http://www.sdnap.com/sdnap-post/2411.html 山东同学-菜(Q群279796875) 21:40:21我是想问,op ...

  6. Android中数据存储之SharedPreferences

    import android.content.Context; import android.content.SharedPreferences; import android.content.Sha ...

  7. Project Euler 98:Anagramic squares 重排平方数

    Anagramic squares By replacing each of the letters in the word CARE with 1, 2, 9, and 6 respectively ...

  8. mysql外键级联更新删除

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  9. WCF入门(三)---WCF与Web服务/Web Service

    下面列出了WCF和Web服务之间存在一些重大差异. 属性:WCF服务是通过定义ServiceContract和OperationContract属性,而在Web服务,WebService和WebMet ...

  10. iOS 使用COPY声明NSSTRING属性

    使用COPY声明NSSTRING属性 2014/05/29 JACE 发表回复 声明一个NSString属性使用copy要优于使用strong.这同样适用于遵守NSCoding协议的不可变类(immu ...