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

转载于:https://www.cnblogs.com/husam/p/6604439.html

高水线 High water mark(HWM)相关推荐

  1. oracle water,对于Oracle High Water Mark(HWM)的理解

    在网上看到不少关于Oracle High Water Mark(HWM)的理解,但是都弄的不太清楚,而且有些说法是不对的,所以还是逼迫自己写篇文章来学习一下,如有不恰当之处请指教,呵呵~ 先看看官方对 ...

  2. Oracle 高水位(HWM: High Water Mark) 说明

    一. 准备知识:ORACLE的逻辑存储管理.        ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块.        1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K ...

  3. oracle hwm 查询,Oracle HWM( High Water Mark)

    Oracle HWM( High Water Mark) 1.什么是HWM 注意:此部分内容请先了解oracle物理结构和逻辑结构 顾名思义,这是一条水位线,oracle的每一个对象都是一个segem ...

  4. zeromq: hwm; high water mark: 高水位线

    文章目录 参考 描述 HWM是怎么触发线程block? How does the HWM (high water mark) work with any socket type? 参考 libzmq/ ...

  5. Oracle-HWM(High Water Mark) 高水位解读

    读前须知:Oracle的逻辑存储管理 ORACLE在逻辑存储上分4个粒度 ,由大到小为: 表空间, 段, 区 和 块. 块Block 块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一 ...

  6. 【计算广告】在线分配算法之 —— HWM(High water mark)介绍

    该算法是雅虎工程师提出的一个解决合约制广告或者说GD(担保式投放)投放系统在线分配问题的贪心算法,思路很直接,下面是本人对照其论文整理的思路,里面有自己的理解. 论文题目:Ad Serving Usi ...

  7. 浅析ORACLE数据库高水位线(high water mark)

    ORACLE数据库逻辑结构包括:数据库块(block),扩展(extent 区),段(segment),表空间(tablespace).高水位线就存在于段(segment)中,它用于标识段中已使用过的 ...

  8. linux系统怎么开514端口,linux系统下如何打开端口

    Jquery 的遍历,祖先.后代.同胞以及其过滤 什么是遍历? jQuery 遍历,意为"移动",用于根据其相对于其他元素的关系来"查找"(或选取)HTML 元 ...

  9. oracle 9i hwm,Oracle中的Low HWM与 High HWM 高水位

    在MSSM的FREELIST下, 高水位High Water Mark代表所有相关块, 高水位以上就是未格式化unformatted 的数据块,INSRT数据时不能直接使用.当FREELIST中不包含 ...

  10. oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM

    概述 深入理解HWM对于做数据库优化是必须掌握的一个基础,很多时候我们以为删了数据后表应该会快很多,但是得到的结果却很不理想,这其中就涉及到HWM方面了,也是truncate和delete不同的地方. ...

最新文章

  1. .NET里面的Interop太烂了
  2. python定_Python 定值类
  3. uva 12508 - Triangles in the Grid(几何+计数)
  4. reactjs render props向组件内部动态传入带内容的标签
  5. RHEL7 yum源配置
  6. url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验
  7. Attribute in C#
  8. KMP算法 --- 在文本中寻找目标字符串
  9. Java中关于HashMap的使用和遍历
  10. sql 获取日期时分秒_sql2000 获取当前日期只要年月日,不要时分秒
  11. ElasticJob3.0整合SpringBoot,ElasticJob-Lite【ElasticJob入门篇】
  12. RationalDMIS 7.1 曲面取极值点
  13. springboot整合RabbitMQ启动报错:An unexpected connection driver error occured,Socket Closed
  14. 层次softmax (hierarchical softmax)理解
  15. eBPF-4-perf_map的丢失事件lost_event解读
  16. Hadoop的两个核心组成
  17. 加入中视频计划赚钱吗?你还别不信收益确定高
  18. 通信对抗干扰技术简单综述与MATLAB仿真
  19. cad中lisp文件给恶作剧_求大神们帮忙更改下CAD 的lsp 文件 小弟谢谢啦
  20. python面板数据模型操作步骤_任何有效的方法来建立面板数据的回归模型?

热门文章

  1. 2021写了这么些文章...
  2. springboot的UnsatisfiedDependencyException异常问题
  3. Android开发中一些被冷落但却很有用的类和方法
  4. python css和xpath_一文学会Python爬虫框架scrapy的XPath和CSS选择器语法与应用
  5. 嵌入式 STM32 步进电机驱动,干货满满,建议收藏
  6. SQL Server 2012 连接到数据库引擎
  7. 【Accountancy】资产
  8. 提交熊掌号网站服务器是否正常,熊掌号服务器配置
  9. 动态规划DP问题分类和经典题型
  10. IDEA学生申请许可证,如果遇到无许可证的时候可申请链接邮箱