• 高水线 High water mark(HWM)


    所有的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

  • 相关阅读:
    破圈法求最小生成树+最小生成树与最短路径问题
    相信你们的锐意前行,终将成就更美好的未来
    “基于模块化自动驾驶底盘的PIX移动空间”发布
    Node:通过 Uglify 压缩小程序代码
    CSS 实用技巧
    websercie调用方式
    IDEA 添加tomcat启动后控制台乱码解决方案
    对象转json串,json转对象
    js 判断一个变量是数组还是对象
    @Transactional 锁表吗?关于Spring注解@Transactional和SQL for update 的一些观点
  • 原文地址:https://www.cnblogs.com/husam/p/6604439.html
Copyright © 2020-2023  润新知