所有的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. selenium2-java 浏览器不同窗口切换

    1,获取浏览器的单个窗口:         String parentWindowid =  driver.getWindowHandle();         System.out.println( ...

  2. 对GridFS数据进行分片

    On this page files 集合 chunks 集合 在对 GridFS 存储进行分片时,需要注意以下的情况: files 集合 大多数情况下不需要对 files 集合进行分片,这个集合通常 ...

  3. tensorflow队列tf.FIFOQueue | enqueue | enqueue_many | dequeue | dequeue_many

    关于队列的相关知识,盗用一张https://blog.csdn.net/HowardWood/article/details/79406891的动态图 import tensorflow as tf ...

  4. centos7下查看cup核数

    centos7下查看cup核数 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat ...

  5. VINS 估计器之优化与边缘化

    VINS的优化除了添加了投影残差,回环检测残差,还有IMU的残差,边缘化产生的先验信息残差等.有些比较难理解,可参考此博客和知乎回答. void Estimator::optimization() { ...

  6. A re-introduction to JavaScript (JS Tutorial) 转载自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript

    A re-introduction to JavaScript (JS Tutorial) Redirected from https://developer.mozilla.org/en-US/do ...

  7. java while循环

    /* while 循环有一个标准格式,还有一个扩展格式 标准格式: while(条件表达式){ 循环体 } 扩展格式: 初始化语句; while(条件判断){ 循环体 步进表达式 } */ publi ...

  8. 力扣—— Swap Nodes in Pairs(两两交换链表中的节点) python实现

    题目描述: 中文: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, ...

  9. GitHub 创建工程

    创建本地代码仓库 打开Git Bash 首先配置自己的身份,这样在提交代码的时候就能知道是谁提交的 输入git config --global user.name 名字 git config --gl ...

  10. 数据库索引(BTree索引和Hash索引)

    索引 索引是为了方便查找我们所需要的数据. mysql支持的索引数据类型 B-Tree索引的特点 B-Tree索引以B+Tree(树)的结构存储数据. B-Tree索引能够加快数据的查询速度: B-T ...