1.什么是高水位?(high water mark 简称:HWM)
     所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词)都有一个在段内存放数据的上线,那么我们把这个上线成为“high water mark”或                   HWM.HWM是一个标记,用来说明已经有多少没有使用的数据块分配给了这个segment。MWM通常增长的幅度为一次5个数据块。原则上
     MWM只会增大,不会缩小。即使表中的全部数据都删除了,那么HWM还是原值,不会变,由于这个特点,使得HWM就像一个水库的历史最高水位。
     
    简单的说就像水库里的历史最高水位。 就如刚挖的水库一样里面没有一滴水,那么它的最高水位为0.同理在刚建的新表中
    由于没有一条数据,所以的高水位是0,随着不断的往里面添加数据,进行增删操作,那么它的高水位就会上涨。 当然也不是
    说你把表的数据删掉一半,它的高水位就会下降,因为高水位代表历史最高水位。  在Oracle中执行delete删除操作不会降低高水位。执行truncate
    操作可以降低高水位,通常能把高水位降到0.  所以为了降低高水位,能尽量使用truncate的就不使用delete操作。
    ---------也就是说进行增删操作只会上涨,不会下跌!!!

2.select 特性和高水位的关系
   在Oracle中执行select 操作扫描的是高水位以下的全部数据块。所以不是说数据库中存放了多少数据块,就会扫描多少个数据块。现在回想以下,如果是一个新建的表,里面没有数       据,那么你执行select 扫描操作,那么高水位线基本就在0上,所以就没有数据块被扫描。扫描的时间就会用的很少。但是现在你往表里
   插入1000万条数据,然后再执行delete操作,但是由于delete操作不影响高水位线,所以高水位线还是原来的高水位线。
   ----------所以就有人经常会说我的表中明明没有一条数据,但是执行select扫描怎么会那么慢呢,这个时候里面的奥秘就在于高水位线了!

3.为什么要降低高水位?
    就行水库泄洪一样,你会打开水闸把超出最高水位预警线的水消退掉。 那么在Oracle中高水位以下存放的都是数据块,每次全表扫描的时候
    都会把高水位以下的全部数据库都扫描一边,如此以来就会很浪会资源,响应时间比较长。  反之,如果我们把高水位降低,那么每次全表扫描的时候
    是不是扫描的数据块是不是就少了。

4.为什么出来一个低HWM?
    在管理段的时候通常有两种方法:手动管理段空间(Manual Segment Space Management )和自动段空间(Automatic Segment Space Management)。
    在手动管理段空间的时候,段中只有一个HWM,但是为什么又会有一个低HWM呢?其实这都是因为自动管理段空间造成的。 在手动管理的时候
    数据插入到新的数据块中,数据库块就先会被格式化然后等待数据访问,但是在自动管理中呢,数据插入到新的数据块中,数据块并没有被格式化,而是在第一次访问这个数据        库块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的快。这条线就叫做低HWM.

    一般来说,低HWM肯定地狱HWM.

5.HWM数据库的操作有如下影响:
   a)全表扫描通常要读出直到hwm标记的所有的属于该表数据块,及时该表中没有任何数据。
   b)即使HWM以下有空闲的数据块,键入在插入数据是使用了APPEND关键字,则在插入时用用HWM以上的数据块,此时HWM会自动增大。

6.那么如何降低高水位呢?
  
降低高水位通常有很多办法。就比如抗洪,你是如何想把洪水消退,可能会想到把水库的水闸打开,把水放掉。。。。。。
   但是在Oracle中降低高水位通常有以下办法:
   1.能使用truncate的尽量不适用delete操作。
   2.新建一个临时表,把数据复制到临时表,然后把源表drop掉,再把临时表重新命名为源表的名字。
   3.移动表空间。(或者不移动表空间)
   4.执行表重建命令(alter table table_name move;)(在线转移表空间ALTER TABLE 。。。 MOVE TABLESPACE 。。。ALTER TABLE 。。。 MOVE 后面不跟参数也行,不跟     参数表还是在原来的表空间,move后记住重建索引。如果以后还要继续向这个表增加数据,没有必要move,只是释放出来的空间,只能这个表用,其他的表或者segment无法       使用该空间)
   5.执行alter table table_name shrink space; 注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动alter table table_name enable row movement;

查看高水位时先进行分析:

--每次查询各个结果时先分析表 才能得到最新的分析结果
analyze table biu_issuer_info compute statistics; select num_rows, blocks, empty_blocks, owner
from user_tables
where table_name = 'BIU_ISSUER_INFO'; --注意这里查询一定要用大写 select count(distinct dbms_rowid.rowid_block_number(rowid) ||
dbms_rowid.rowid_relative_fno(rowid)) zs
from BIU_ISSUER_INFO; --如果实际用的块数比高水位线低很多的话,则调整高水位可显著改善全表扫描效率 alter table BIU_ISSUER_INFO enable row movement; alter table BIU_ISSUER_INFO shrink space;

最新文章

  1. iOS之小门道道
  2. 为什么Java不支持多继承?
  3. NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)
  4. UOJ 08 Quine 是在下输了
  5. [Angular 2] Using ngrx/store and Reducers for Angular 2 Application State
  6. HDU 1686 Oulipo(kmp)
  7. LeetCode 319. Bulb Switcher
  8. 微信小程序开发《二》:http请求的session管理
  9. 解析xml文件的四种方式
  10. Jeecg-Boot 1.0版本发布,企业级快速开发平台
  11. 下面哪项技术可以用在WEB开发中实现会话跟踪实现?
  12. Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)
  13. 无法初始化 PowerShell 主机解决方案
  14. [转]pycharm active code
  15. ARP协议详解之Gratuitous ARP(免费ARP)
  16. Tornado源码分析 --- Redirect重定向
  17. PHP开发之环境配置
  18. 5 matplotlib-绘制精美的图表
  19. 我眼中的SAML (Security Assertion Markup Language)
  20. VS LNK2019 解决办法之一

热门文章

  1. 浏览器端-W3School-HTML:HTML DOM cells 集合
  2. Java学习之==>异常体系
  3. Delphi中基本控件之SaveDialog控件的使用总结
  4. LeetCode.1018-可被5整除的二进制数(Binary Prefix Divisible By 5)
  5. centos v7.0解决乱码
  6. echats--》饼图 如何在环形中央设置 文字?
  7. 【洛谷P1119题解】灾后重建——(floyd)
  8. windows 通过cmd命令行管理防火墙
  9. Python 从大型csv文件中提取感兴趣的行
  10. 剑指offer-顺时针打印矩阵-数组-python