1. Oracle表段中的高水位线HWM :
  2. 在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。
  3. 水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark,
  4. HWM)。
  5. 在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值
  6. 。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删
  7. 除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水
  8. 位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。HWM通常增长的幅度为一次
  9. 5个数据块.
  10. Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库
  11. 中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。
  12. 理解高水位的作用:理解全表扫描的开销(实验:如果)
  13. @@@@@@
  14. 修正ORACLE表的高水位线
  15. ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)
  16. 中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的
  17. 性能低下。rebuild, truncate, shrink,move  等操作会降低高水位。
  18. A、执行表重建指令 alter table table_name move;(把楼移到另一块地)
  19. B、 执行alter table table_name shrink space; 此命令为Oracle 10g新增功能,再执行该指令之
  20. 前必须允许行移动 alter table table_name enable row movement;
  21. C、 重建表
  22. 复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
  23. D、 用逻辑导入导出: Emp/Imp
  24. E、. Alter  table table_name deallocate unused
  25. DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动
  26. HWM的位置.
  27. F、 推荐使用truncate.
  28. @@@@@
  29. ORACLE用HWM来界定一个段中使用的块和未使用的块.
  30. 举个例子来说,当我们创建一个表时,ORACLE就会为这个对象分配一个段.在这个段中,即使我们未插
  31. 入任何记录,也至少有一个区被分配,第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储
  32. 存了一些信息,其中HWM的信息就存储在此.此时,因为第一个区的第一块用于存储段头的一些信息,虽
  33. 然没有存储任何实际的记录,但也算是被使用,此时HWM是位于第2个块.当我们不断插入数据到表后,
  34. 第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据,同时,HWM
  35. 本身也向上移.也就是说,当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用
  36. 过的块,HWM之上的就表示已分配但从未使用过的块.
  37. HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移.
  38. ORACLE 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并
  39. 且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM),
  40. @@@
  41. ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块.
  42. @@@
  43. 什么样的插入是在高水位上面进行插入的?(append操作(不检查高水位线是否有数据,效率高,
  44. 不写日志,浪费空间))
  45. 当用直接路径插入行时,即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,
  46. 则在插入时使用HWM以上的数据块,此时HWM会自动增大。
  47. 例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 数据块直接置于
  48. HWM 之上。它下面的空间就浪费掉了。
  49. @@@@
  50. 相关测试:
  51. SQL> create table tt (id number);此时表没有分析,是原始的数据,即8个数据块。
  52. SQL> select segment_name,segment_type,blocks from dba_segments where segment_nam
  53. e='TT';
  54. SEGMENT_NAME
  55. --------------------------------------------------------------------------------
  56. SEGMENT_TYPE           BLOCK
  57. ------------------ ----------
  58. TT
  59. TABLE                       8(段占用了多少个块)
  60. SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table
  61. _name='TT';
  62. TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
  63. ------------------------------ ---------- ---------- ------------
  64. TT
  65. declare
  66. i number;
  67. begin
  68. for i in 1..10000 loop
  69. insert into tt values(i);
  70. end loop;
  71. commit;
  72. end;
  73. /
  74. SQL>  SELECT segment_name,segment_type,blocks FROM dba_segments  WHERE
  75. segment_name='TT';
  76. SEGMENT_NAME    SEGMENT_TYPE        BLOCKS
  77. --------------- --------------- ----------
  78. TT              TABLE                   24
  79. 注释:user_dbasegments中的BLOCKS 列代表该表中曾经使用过得数据库块的数目
  80. dba_dbasegments中的BLOCKS 列代表段占用多少个块
  81. SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables  WHERE
  82. table_name='TT';
  83. TABLE_NAME        NUM_ROWS     BLOCKS EMPTY_BLOCKS
  84. --------------- ---------- ---------- ------------
  85. TT
  86. 此时表TT 占用的数据库已经是24个了。 但是user_tables 显示的信息还是为空。 因为没有做统计
  87. 分析。
  88. exec DBMS_STATS.GATHER_TABLE_STATS('SYS','TT');(收集统计信息)
  89. SQL> exec DBMS_STATS.GATHER_TABLE_STATS('SYS','TT');(收集统计信息)
  90. PL/SQL 过程已成功完成。
  91. SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables  WHERE
  92. table_name='TT';
  93. TABLE_NAME        NUM_ROWS     BLOCKS EMPTY_BLOCKS
  94. --------------- ---------- ---------- ------------
  95. TT                   10000         20            0
  96. 此时user_tables 已经有了数据,显示的使用了20个数据块。 但是empty_blocks 还是为空。
  97. 这里要注意的地方。 这个字段只有使用analyze 收集统计信息之后才会有数据。
  98. 5) 使用analyze 收集统计信息
  99. SQL> ANALYZE TABLE TT COMPUTE STATISTICS;
  100. Table analyzed.
  101. SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables  WHERE
  102. table_name='TT';
  103. TABLE_NAME        NUM_ROWS     BLOCKS EMPTY_BLOCKS
  104. --------------- ---------- ---------- ------------
  105. TT                   10000         20            3
  106. 这个时候高水位在哪里呢?20(20+3=23<24) 这里有显示空的数据库有3个。
  107. 注意:20+3=23. 比占用的24个数据块少一个。因为有一个数据库块被保留用作segment header。
  108. delete 数据
  109. 看是否会影响他的段大小
  110. delete from tt;
  111. commit
  112. SQL>  SELECT segment_name,segment_type,blocks FROM dba_segments  WHERE
  113. segment_name='TT';
  114. SEGMENT_NAME    SEGMENT_TYPE        BLOCKS
  115. --------------- --------------- ----------
  116. TT              TABLE                   24
  117. SQL>analyze table tt compute statistics;(算出高水位线在那一块)
  118. SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table
  119. _name='TT';(blocks为高水位线)
  120. TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
  121. ------------------------------ ---------- ---------- ------------
  122. TT                                      0         20            3
  123. 这里我们可以证明了什么:高水位不受delete 影响
  124. SQL>insert into tt select * from tt;(tt已经删除没有数据)
  125. SQL> insert into tt select rownum from dba_objects;
  126. 已创建50323行。
  127. SQL>analyze table tt compute statistics;
  128. SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table
  129. _name='TT';(查看高水位线(blocks))大于20
  130. TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
  131. ------------------------------ ---------- ---------- ------------
  132. TT                                  50323         79            0
  133. 这里我们可以证明了什么:高水位不受commit影响,只要有插入数据HWM就会增加
  134. @@@@@
  135. 释放高水位(truncate)
  136. SQL> truncate table tt;
  137. 表被截断。
  138. SQL> ANALYZE TABLE TT COMPUTE STATISTICS;
  139. 表已分析。
  140. SQL> select segment_name,segment_type,blocks from dba_segments where segment_nam
  141. e='TT';
  142. SEGMENT_NAME
  143. --------------------------------------------------------------------------------
  144. SEGMENT_TYPE           BLOCKS
  145. ------------------ ----------
  146. TT
  147. TABLE                       8(又回到原来的8)

转载于:https://blog.51cto.com/toratto/1147989

oracle HWM相关推荐

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

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

  2. oracle hwm调整语法,Oracle 10g HWM原理及性能优化

    摘  要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响.当全表扫描时,Oracle会读取HWM下所有的块, ...

  3. oracle hwm的位置,Oracle 高水位(HWM)教程(2)

    4. 用逻辑导入导出: Emp/Imp 5. Alter table table_name deallocate unused 注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空 ...

  4. oracle hwm 查询,oracle HWM

    Oracle表段中的高水位线HWM : 在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水. 水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(H ...

  5. oracle hwm 查询,Oracle中的HWM

    1.什么是高水位线(High Water Mark) 对于一个段(逻辑上其实可以说一个表),有一个段里容纳数据的上限,这个上限就是高水位线.通常这个HWM只会增加不会减少,因为它记录的是存储数据最多时 ...

  6. oracle hwm调整语法,各个Oracle 版本下如何调整高水位(HWM)

    各个Oracle 版本下如何调整高水位(HWM) 以下没有注明版本号的各版本都适用. 1.CTAS : create table xxx_new tablespace new_tablespace_n ...

  7. oracle hwm没有释放,如何去判断一张表的HWM是否高?

    一.何时应该降低高水位(HWM) Table包含两种空闲的block,在HWM之上的空闲block和在HWM之下的空闲Block. 释放HWM之上的空闲block: Alter table table ...

  8. oracle hwm调整语法,oracle 10g 下 HWM 在线调整用 Shrink 是较佳选择

    [测试Shrink作用示例] Shrink如何重置空块? Shrink与Move的差异在哪里? 相信用实例来解释比较好一点: Code: SQL> create table t ( x numb ...

  9. oracle 9i hwm,Oracle 10g HWM原理及性能优化

    摘 要: HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响.当全表扫描时,Oracle会读取HWM下所有的块,即 ...

  10. oracle 9i hwm,Oracle 之HWM

    Oracle HWM 什么是HWM 所有的oracle segments都有一个在段内容纳数据的上限,我们把这个上限称为HWM(High Water Mark).这个HWM是一个标记,用来说明已经有多 ...

最新文章

  1. 数据库SQL Server
  2. U3D 场景切换时 脚本对象,GO对象,资源对象的问题
  3. 随笔编号-03 基本类型相互转换集合
  4. svn 版本控制操作命令
  5. html个人博客完整代码_hexo | 不用写代码,2小时快速搭建个人博客
  6. PHP学习之六:预定义常量
  7. 解决:SpringBoot 搭建聚合项目 报 “程序包XXX不存在”
  8. spring boot admin 自定义
  9. std::map,不同的插入方式,会导致崩溃
  10. 获取实时股票行情通达信接口
  11. entity cannot be tracked
  12. 没有钱到底要不要创业?
  13. 安科瑞DTSD/ADL400通讯协议说明-Susie 周
  14. 批量下载excel中超链接对应的文件
  15. 显卡无法为此计算机,如何解决win10系统电脑中无法安装intel显卡驱动的问题
  16. PHP Startup: Unable to load dynamic library -找不到指定模块解决方法
  17. GitHub两天标星2.1K+!自动刷喵币靠这一个脚本就够了.....
  18. 34、CSS高频前端面试题之CSS基础
  19. CSS3干货23:常用字体样式设置
  20. 宝可梦 图片识别python_初探利用Python进行图文识别(OCR)

热门文章

  1. pandas 下一行减去上一行
  2. 纯真IP库PHP查询
  3. linux ruby作用域,Ruby 的作用域和作用域门
  4. nginx trac mysql svn_linux下nginx+svn
  5. 设计并搭建Python容器化项目的CI/CD流水线
  6. Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
  7. Google官方 详解 Android 性能优化【史诗巨著之内存篇】
  8. Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
  9. principle文本导入oracle,动效设计Principle:初识界面
  10. java动画帧储存路径_Java实现帧动画的实例代码