oracle11g表的高水位线hwm与dbms_space系列一

背景

  了解表段的高水位线与不同状态数据块的关系,以及高水位线一些相关概念;
且熟悉哪些字典或包及过程与此相关。 

结论
1,oradebug形成的TRC文件中的HWM我没有研究明白,这块比较深,还需梳理思路再战
2,表的高水位线采用dbms_space.unsed_space获取
3,表的高水位线=total blocks - total unused blocks +1
4, 表仅插入时,其total unused blocks为0,仅DELETE后此参数才会为非0值
5,last used block为最新分配的区的数据块个数
6, alter table move或者alter table shrink space可以在删除表的记录后,下降表的高水位线
7, alter table shrink space compact即使在表删除记录后,仍不会下降表的高水位线

测试

1,数据库版本
SQL> select * from v$version where rownum=1;


BANNER
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


2,创建测试表
SQL> create table t_hwm(a int,b int);


Table created.


3,插入数据
SQL> insert into t_hwm values(1,1);


1 row created.


SQL> commit;


Commit complete.


4,获取表段所属文件及段头数据块
SQL> select segment_name,header_file,header_block,bytes,blocks from dba_segments where lower(segment_name)='t_hwm';


SEGMENT_NAME                   HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS
------------------------------ ----------- ------------ ---------- ----------
T_HWM                                    4        85442      65536          8


5,转储表段头数据块
SQL> oradebug setmypid;
ORA-01031: insufficient privileges
SQL> show user
USER is "SCOTT"
SQL> conn /as sysdba
Connected.
SQL> oradebug setmypid;
Statement processed.
SQL> alter system dump datafile 4 block 85442;


System altered.


SQL> oradebug tracefile_name;
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_28025.trc
SQL> 


6,获取转储文件TRC的高水位线
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_28025.trc|grep -i --color high
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Low HighWater Mark : 
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Level 1 BMB for High HWM block: 0x01014dc0


7,再次插入数据,看下高水位线会不会变化
SQL> insert into scott.t_hwm select * from scott.t_hwm;


1 row created.


SQL> commit;


Commit complete.


可见插入数据量小时,高水位线是不会变化的
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_2943.trc|grep -i --color high
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Low HighWater Mark : 
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Level 1 BMB for High HWM block: 0x01014dc0




也就是说只要插入数据量到达一定情况,高水位线才会发生变化,所以我们继续插入数据,直接分配新的区
SQL> select count(*) from dba_extents where segment_name='T_HWM';


  COUNT(*)
----------
         1


SQL> insert into scott.t_hwm select * from scott.t_hwm;


2048 rows created.


SQL> commit;


Commit complete.


SQL> select count(*) from dba_extents where segment_name='T_HWM';


  COUNT(*)
----------
         2


可见即使分配第2个区,高水位线仍不会变化
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_6326.trc|grep -i --color high
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Low HighWater Mark : 
      Highwater::  0x01014dc8  ext#: 0      blk#: 8      ext size: 8     
  Level 1 BMB for High HWM block: 0x01014dc0


8,继续插入数据,可见只要插入数据到达一定程度,表段的高水位线才会推进和变化
SQL> insert into scott.t_hwm select * from scott.t_hwm;


16384 rows created.


SQL> select count(*) from dba_extents where segment_name='T_HWM';


  COUNT(*)
----------
         7


SQL> commit;


Commit complete.


[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_9443.trc|grep  -i --color high
      Highwater::  0x01014dd0  ext#: 1      blk#: 8      ext size: 8     
  Low HighWater Mark : 
      Highwater::  0x01014dd0  ext#: 1      blk#: 8      ext size: 8     
  Level 1 BMB for High HWM block: 0x01014dc0




9,现在出现一个问题,到底表段的数据插入到什么程度后,其高水位线才会推进和变化呢?


---表所有者及相关,要用大写,否则报错
create or replace procedure proc_show_space
as
v_total_blocks number;
v_total_bytes number;
v_unused_blocks number;
v_unused_bytes number;
v_last_used_extent_file_id number;
v_last_used_extent_block_id number;
v_last_used_block number;
begin
dbms_space.unused_space('SCOTT','T_HWM','TABLE',v_total_blocks,v_total_bytes,v_unused_blocks,v_unused_bytes,v_last_used_extent_file_id,v_last_used_extent_block_id,v_last_used_block);
dbms_output.put_line('total blocks ..............'||v_total_blocks);
dbms_output.put_line('total unused blocks .......'||v_unused_blocks);
dbms_output.put_line('last used block............'||v_last_used_block);
end;
/


SQL> select extent_id,blocks from dba_extents where segment_name='T_HWM';


 EXTENT_ID     BLOCKS
---------- ----------
         0          8
         1          8
         2          8
         3          8
         4          8
         5          8
         6          8


7 rows selected.


SQL> exec proc_show_space;
total blocks ..............56
total unused blocks .......0
last used block............8


PL/SQL procedure successfully completed.


可见此时高水位线=total blocks - total unused blocks +1=57


SQL> insert into scott.t_hwm select * from scott.t_hwm;


32768 rows created.


SQL> commit;


Commit complete.


SQL> exec proc_show_space;
total blocks ..............112
total unused blocks .......0
last used block............8


PL/SQL procedure successfully completed.


可见继续插入记录后,此时高水位线=total blocks - total unused blocks +1=113


删除表记录表的高水位线不会下降
SQL> delete from scott.t_hwm  where rownum<=3000;


3000 rows deleted.


SQL> commit;


Commit complete.


SQL>  exec proc_show_space;
total blocks ..............112
total unused blocks .......0
last used block............8


PL/SQL procedure successfully completed.








继续插入记录,验证下last used block的含义,可见last used block即最新分配区的数据块个数
SQL> select count(*) from scott.t_hwm;


  COUNT(*)
----------
   1000576


SQL> select extent_id,blocks from dba_extents where segment_name='T_HWM';


 EXTENT_ID     BLOCKS
---------- ----------
         0          8
         1          8
         2          8
         3          8
         4          8
         5          8
         6          8
         7          8
         8          8
         9          8
        10          8


 EXTENT_ID     BLOCKS
---------- ----------
        11          8
        12          8
        13          8
        14          8
        15          8
        16        128
        17        128
        18        128
        19        128
        20        128
        21        128


 EXTENT_ID     BLOCKS
---------- ----------
        22        128
        23        128
        24        128
        25        128
        26        128
        27        128


28 rows selected.




SQL>  exec proc_show_space;
total blocks ..............1664
total unused blocks .......0
last used block............128


PL/SQL procedure successfully completed.


表MOVE后高水线下降
SQL> alter table scott.t_hwm move;


Table altered.


SQL>  exec proc_show_space;
total blocks ..............1664
total unused blocks .......107
last used block............21


PL/SQL procedure successfully completed.


高水位线=1664-107+1=158




除了表的MOVE可以下降表的高水位线,还有其它方法吗


SQL> delete from scott.t_hwm where rownum<=2000;


2000 rows deleted.


SQL> commit;


Commit complete.


SQL>  exec proc_show_space;
total blocks ..............1664
total unused blocks .......107
last used block............21


PL/SQL procedure successfully completed.




SQL> alter table scott.t_hwm shrink space;
alter table scott.t_hwm shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled


可见通过alter table shrink space也可以下降表的高水位线,但前提先要打开表的行移动,这时就会影响表的索引可用性
SQL> alter table scott.t_hwm enable row movement;


Table altered.


SQL> alter table scott.t_hwm shrink space;


Table altered.




SQL>  exec proc_show_space;
total blocks ..............1560
total unused blocks .......6
last used block............18


PL/SQL procedure successfully completed.






可见alter table shrink space compact不会下降表的高水位线
SQL> delete from scott.t_hwm where rownum<=100;


100 rows deleted.


SQL> commit;


Commit complete.


SQL>  exec proc_show_space;
total blocks ..............1560
total unused blocks .......6
last used block............18


PL/SQL procedure successfully completed.


SQL> alter table scott.t_hwm shrink space compact;


Table altered.


SQL>  exec proc_show_space;
total blocks ..............1560
total unused blocks .......6
last used block............18


PL/SQL procedure successfully completed.

个人简介


8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院     
河北廊坊新奥集团公司

 项目经验:
中国电信3G项目AAA系统数据库部署及优化
      中国联通4G数据库性能分析与优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg 
       贵州移动crm及客服数据库性能优化项目
       贵州移动crm及客服务数据库sql审核项目
       深圳穆迪软件有限公司数据库性能优化项目

联系方式:
手机:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub博客名称:wisdomone1    http://blog.itpub.net/9240380/







来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1814711/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-1814711/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值