所有的Oracle表都有一个容纳数据的上限(很像一个水库历史最高的水位),我们把这个上限称为“High water mark"或HWM。这个HWM是一个标记(专门有一个数据块来记录高水标记等),用来说明已经有多少数据块分配给这个表。HWM通常增长的幅度为一次5个数据块。

    
    高水线的作用,HWM对数据库的操作有如下影响:
  1. 全表扫描通常要读出直到HWM标记的所有的属于该表数据块,即使该表中没有任何数据。
  2. 即使HWM以下有空闲的数据块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,些时HWM会自动增大。
    因此,高水线是Oracle优化时一个重要的参数。
 
    通常,我们在表空间中创建一张表时,Oracle就会初始分配一些blocks/extents给该表,之后,随着表中数据量的增加,也会相应的给表自动分配blocks/extents。
 
上机练习:
    
    初始创建一张表HWM_TEST, 通过查询DBA_SEGMENTS的列BLOCKS和EXTENTS可以得到已分配该表的BLOCKS和EXTENTS:
SQL>conn username/password
Connected
SQL>select blocks,empty_blocks,num_wors,from dba_tables where table_name='HWM_TEST';
            BLOCKS        EMPTY_BLOCKS        NUM_ROWS
        -------------    --------------------    ------------------
                     103                            9                        8000        -->表HWM_TEST占用了103个block,9个block未使用,有8000行记录。
SQL>select blocks,extents,header_block from dba_segments where segment_name='HWM_TEST';
             BLOCKS   EXTENTS HEADER_BLOCK
         ----------      ----------       ------------
                  112          14                     83    -->Oracle总共为表HWM_TEST分配了112个block,14个extent,段头(Segment Header)所在块是83号。
SQL>delete from hwm_test where rownum < 3001;      -->删除部分数据。
3000 rows deleted.
SQL>commit;
Commit complete.                  -->提交。
 
现在我们再查询DBA_TABLES、DBA_SEGMENTS时,统计数据是没有任何变动的,需要分析一下:
 
SQL>analyze table hwm_test compute statistics;
Table analyzed.
SQL>select blocks,empty_blocks,num_rows from dba_tables where table_name='HWM_TEST';
   BLOCKS EMPTY_BLOCKS  NUM_ROWS
---------- ------------ ----------
      103           9      5000              -->经过analyze后,发现统计的记录数发生了变化,可数据块的数量并没有变化。
SQL>select blocks,extents,header_block from dba_segments where segment_name ='HWM_TEST';
   BLOCKS   EXTENTS HEADER_BLOCK
---------- ---------- ------------
      112        14          83
 
那如何确定表HWM_TEST究竟使用了多少个block呢?可以通过ROWID的来查询:
 
SQL>select count(distinct dbms_rowid.rowid_block_number(rowid)) "Used Blocks" from HWM_TEST;
Used Blocks
-----------
        63
 
那现在可以明白:Oracle分配了112个block给HWM_TEST表,其中有103个数据块保存用户数据,但实际上是有63个block是实际用户数据占用的block数。
 
降低高水线有多种方法:EXP/IMP、TRUNCATE或者使用MOVE,在10G,Oracle提供了shrink功能。使用哪种方法因人而异且需要根据实际情况,一般情况我习惯使用MOVE和SHRINK。
 
1、使用alter table ... shrink space
 
SQL>alter table HWM_TEST enable row movement;
Table altered.                          -->这是必须的步骤, 即将收缩(shrink)的数据表,必须启用row movement。
SQL>alter table HWM_TEST shrink space;
Table altered.                          -->这就是收缩空间语句的庐山真面目,当然还可以加其他参数,如加级联(cascade),就会把相应的索引段也进行收缩。
 
SQL>analyze table HWM_TEST compute statistics;
Table analyzed.                      -->再次分析表HWM_TEST。
SQL>select blocks,empty_blocks,num_rows from dba_tables where table_name='HWM_TEST';
   BLOCKS EMPTY_BLOCKS  NUM_ROWS
---------- ------------ ----------
       63           9      5000       -->现在BLOCKS值变为63了。
 
2、使用alert table ... move
 
SQL>select blocks,empty_blocks,num_rows from dba_tables where table_name='HWM_TEST';
   BLOCKS EMPTY_BLOCKS  NUM_ROWS
---------- ------------ ----------
       70           2      3001
SQL>alter table hwm_test move;
Table altered.
SQL>analyze table hwm_test compute statistics;
Table analyzed.
SQL>select blocks,empty_blocks,num_rows from dba_tables where table_name='HWM_TEST';
   BLOCKS EMPTY_BLOCKS  NUM_ROWS
---------- ------------ ----------
       43           5      3001                                
 
使用alter table ... shrink space/move均可收缩表的高水线

本文出自 “FROG_HONG” 博客,请务必保留此出处http://76287.blog.51cto.com/66287/1025579

高水线 High water mark(HWM)的更多相关文章

  1. High Water Mark 图示

    +---- high water mark of newly created table | V +-------------------------------------------------- ...

  2. oracle:block 的 water mark问题

    看了小布老师关于block里面数据存储的high water mark的实验,自己也做了一遍. SQL> create table x(i int,name varchar(20)); Tabl ...

  3. Oracle段高水位(HWM, high water mark)问题

    Oracle对表做全表扫描的时候 ,会扫描完HWM以下的数据块.如果某个表delete(delete操作不会降低高水位)了大量数据,那么这时对表做全表扫描就会做很多无用功,扫描了一大堆数据块,最后发现 ...

  4. Oracle 高水位(HWM: High Water Mark)

    http://blog.itpub.net/31397003/viewspace-2137246/ http://blog.itpub.net/12778571/viewspace-582695/ h ...

  5. water mark

    图片水印 https://www.oschina.net/p/watermarkjs?nocache=1542795300822 https://www.cnblogs.com/pengjunhao/ ...

  6. [转]jQuery TextBox Water Mark with asp.net

    本文转自:http://naspinski.net/post/jQuery-TextBox-Water-Mark-with-aspnet.aspx I stole majority of this c ...

  7. Oracle 高水位说明和释放表空间,加快表的查询速度

    高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...

  8. freeRTOS中文实用教程6--错误排查

    1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...

  9. FreeRTOS

    一.内核配置 1.configUSE_PREEMPTION 设置为1,使用抢先式内核:设置为0,为合作轮转内核. 2.configCPU_CLOCK_HZ 内部处理器执行的频率.这个值需要正确配置外围 ...

随机推荐

  1. 安装mysql5.6.24解压版

    第一步:配置环境变量    第二步:修改 my-default.ini 文件  找到mysql 文件夹中的my-default,ini 修改成如下图 如果不修改直接运行cmd  net start m ...

  2. Python笔记(六)_函数

    函数一般是从第一行代码开始执行,结束于return语句.异常.或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这 ...

  3. CSS 6种完全居中最佳实践(整理)

    2016年4月28日 1.最佳法: .Absolute-Center { width: 50%; height: 50%; overflow: auto; margin: auto; position ...

  4. Reciting(third)

      It is subtly demonstrate in the portrayal that a teacher is teaching mathmatics in a certain class ...

  5. LeetCode刷题: 【120】三角形最小路径和

    1. 题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小 ...

  6. <转>Excel生成guid、uuid

    Excel生成guid.uuid  原文地址:https://www.cnblogs.com/jory/p/7718305.html  1.Excel生成guid,uuid  格式:600d65bc- ...

  7. Android深度探索-卷1第三章心得体会

    第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了 ...

  8. js转换成数字

    /** * 转换成数字,有两种方法: * 1.Number(var) * 2.parseInt(var)与parseFloat(var) */ // 字符串转换成数字 // 纯字母 var foo = ...

  9. python实现发送文本邮件

    简单实现了python发送文本邮件 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/4/25 17:09 # @Author ...

  10. 常用的kubectl命令

    本文主要介绍kubernetes排查问题时经常用到的命令.这里主要借助kubectl命令来实现.以下列出常用命令,后面会对每个命令进行详细解释,并举例: kubectl核心命令 get  获取列出一个 ...