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. Eclipse对svn操作切换账号或更换svn地址方法

    1. 切换账号,主要是删除配置文件达到重新更新svn的时候,弹出框让重新输入新的svn用户名和密码. 1.通过删除SVN客户端的账号配置文件   1)查看你的Eclipse中使用的是什么SVN Int ...

  2. Zabbix 安装及微信短信提醒

    Zabbix简介 Zabbix 近几年得到了各大互联网公司的认可,当然第一点归功与它强大的监控功能,第二点免费开源也得到了广大用户的青睐.Zabbix 能将操作系统中的绝大部分指标进行监控,比如(CP ...

  3. 使用tornado让你的请求异步非阻塞

    http://www.dongwm.com/archives/shi-yong-tornadorang-ni-de-qing-qiu-yi-bu-fei-zu-sai/?utm_source=tuic ...

  4. 在实体注解OneToMany时,要加上mappedby,避免产生中间表。

    在实体注解OneToMany时,要加上mappedby,避免产生中间表.

  5. Javascript 电子时钟源码

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. JS事件(事件冒泡和事件捕获)

    事件流:描述的是在页面中接收事件的顺序 事件冒泡:由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点(文档) 事件捕获:最不具体的节点先接收事件,而最具体的节点应该是最后接收事件 DOM中:用 ...

  7. SRAM与SDRAM的区别

    http://www.cnblogs.com/spartan/archive/2011/05/06/2038747.html SDRAM SDRAM(Synchronous Dynamic Rando ...

  8. 最受欢迎的ASP.NET的CMS下载

    1. Umbraco 项目地址 下载 Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据.使用Umbraco,设计师能创造出有效的XHTML标记模板和 ...

  9. 成为一个PHP专家:缺失的环节

    这一篇文章是“Becoming a PHP Professional”系列 4 篇博文中的第 1 篇. 当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的 ...

  10. url、href、src 详解

    发现自己居然没把url.href.src关系及使用搞清楚,今天就理一下.主要包括:url.src.href定义以及使用区别.顺便试下在segmentfault来一发. URL(Uniform Reso ...