所有的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. mysql linux下安装部署

    一.安装简介 用户名:mysql安装目录:/usr/local/mysql-5.5数据库目录:/data/mysql/data源码包:mysql-5.5.28.tar.gz 二.安装准备 a.vi / ...

  2. Centos 7.3 配置Xmanager XDMCP

    我们通常需要远程桌面,这会带来很好的便利性,而Centos7的XDMCP配置过程发生了变化,添加了很多新特性,初期难免会不适应,但新系统终究还是不错的.下面看看Centos7下如何配置XManager ...

  3. PHP将mysql数据表转换为excel文件

    测试代码: <?php $DB_Server = "127.0.0.1"; $DB_Username = "root"; $DB_Password = & ...

  4. CF561做题

    C题: 一期思路:我们发现如果x,y满足条件,那么{x,-y} {-x,y} {-x,-y}也满足条件.那么我们可以只讨论|x| |y|是否满足条件,如果满足条件,那么对ans的贡献是|x|出现次数* ...

  5. git使用记录八:不同提交的指定文件的差异

    不同提交的指定文件的差异 git diff commit-id1 commit-id2 path-to-filename

  6. python 类和对象下

    类的常用函数 issubclass() 检测一个类是否是另外一个类的子类 格式1:issubclass(被检测类,父类) 返回值:布尔值 格式1:issubclass(被检测类,(父类1,父类2,父类 ...

  7. C#虚方法和抽象方法的区别

    一,如下例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespa ...

  8. android SharedPreferences 存储文件

  9. macos系统安装nginx

    MacOS系统安装软件: macos系统下没有yum和apt-get命令,要安装软件需要使用homebrew. 1.安装homebrew: 安装:/usr/bin/ruby -e "$(cu ...

  10. 一、bootstrap-select输入选择框

    一.bootstrap-select简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta ...