HWM的实验
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的实验的更多相关文章
- MOVE降低高水位 HWM
MOVE降低高水位 HWM --创建实验表空间SQL> create tablespace andy03 datafile '/home/oracle/app/oradata/orcl/andy ...
- Oracle中HWM与数据库性能的探讨
Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...
- Oracle中 HWM与数据库性能的探讨
链接:http://www.eygle.com/archives/2011/11/oracle_hwm_tuning.html 本文讨论的是oracle中关于table的HWM的内容,主要包括这样几个 ...
- [原] 利用 OVS 建立 VxLAN 虚拟网络实验
OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- SEED实验系列文章目录
美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...
- 物联网实验4 alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
一. HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...
- (原创) alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
随机推荐
- linux杀掉80端口线程命令
80端口被其他程序占用, fuser -k -n tcp 80
- OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
- mysqlbinlog工具基于日志恢复详细解释
如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...
- Nagios 安装及微信短信提醒
引言 Nagios 作为业界非常强大的一款开源监视系统. 监控网络服务(SMTP.POP3.HTTP.NNTP.PING 等): 监控主机资源(处理器负荷.磁盘利用率等): 简单地插件设计使得用户可以 ...
- POJ3253Babelfish
http://poj.org/problem?id=3253 就是一个哈夫曼树,题目下边有提示,所以题意还是好理解的 #include<cstdio> #include<cstrin ...
- hibernate的简单学习(第一天)
sql脚本: -- Create table drop table T_PERSON; create table T_PERSON ( id ) PRIMARY KEY, name ), passwo ...
- HUSTOJ(转发)
来源:http://blog.csdn.net/xiajian2010/article/details/12954855 缘起 大四了,快毕业了,所以想准备点LAMP的知识和经验.刚好实验室里有人在搞 ...
- lintcode:Coins in a Line 硬币排成线
题目 硬币排成线 有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 样例 n = 1, 返回 ...
- Hibernate逍遥游记-第9章 Hibernate的映射类型
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- NPOI基础入门(旧版本)
1.常用的类与方法 工作本HSSFWorkbook 构造方法,无参表示创建一个新的工作本,可以接收一个流用于打开一个现有的工作本 方法CreateSheet(索引):创建指定索引的sheet对象 方法 ...