[转]Oracle High Water Level高水位分析

PLSQL_性能优化系列14_Oracle High Water Level高水位分析

http://www.cnblogs.com/eastsea/p/4005814.html

一、摘要



PLSQL_性能优化系列14_Oracle High Water Level高水位分析

高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式。高水位线对全表扫描方式有着至关重要的影响。

当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。

本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响。

1. 何谓高水位线

如前所述,类似于水库中储水的水位线。只不过在数据库中用于描述段的扩展方式。

可以将数据段或索引段等想象为一个从左到右依次排开的一系列块。当这些块中未填充任何数据时,高水位线位于块的最左端(底端)

随着记录的不断增加,新块不断地被填充并使用,高水位线随之向右移动。高水位线之上为未格式化的数据块。

删除(delete)操作之后,高水位线之下的块处于空闲状态,但高水位线并不随之下降,直到重建,截断或收缩表段。

全表扫描会扫描高水位线之下的所有块,包括空闲数据块(执行了delete操作)。

2. 低高水位线

是在使用ASSM时的一个概念。即使用ASSM时除了高水位线之外,还包括一个低高水位线。低高水位线一定是位于高水位线之下。

当段使用MSSM管理方式时只有一种情况即只存在一个高水位线。

使用MMSM时,当HWM升高时,Oracle立即格式化所有块且有效,并可以安全读取。仅当第一次使用时完成格式化,便于安全读取数据。

使用ASSM时,当HWM升高时,Oracle并不会立即格式化所有块。仅当第一次使用时完成格式化,便于安全读取数据。

使用低高水位线可以减少当全面扫描表段时,低高水位线与高水位线之间不安全块的检查数量。即低高水位线之下的块不再检查。

二、案例 - Delete / SHRINK SPACE CASCADE / Truncate Table 对水位线的影响



1. 创建测试表和资料,并分析

Step1. 创建表

CREATE TABLE sh.bxj_high_water_level
AS
       SELECT   ROWNUM AS id,
                ROUND (DBMS_RANDOM.normal * 1000) AS val1,
                DBMS_RANDOM.string (‘p‘, 250) AS pad
         FROM   DUAL
   CONNECT BY   LEVEL <= 10000;

Step2. 收集表的统计信息

BEGIN
   DBMS_STATS.gather_table_stats (‘SH‘,
                                  ‘BXJ_HIGH_WATER_LEVEL‘,
                                  cascade   => TRUE);
END; 

ANALYZE TABLE sh.bxj_high_water_level COMPUTE STATISTICS;

Step3. 表的统计信息和Block信息

SQL> select count(*) from sh.bxj_high_water_level;

Execution Plan
----------------------------------------------------------
Plan hash value: 4214873579

-----------------------------------------------------------------------------------
| Id  | Operation          | Name                 | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                      |     1 |   107   (0)| 00:00:02 |
|   1 |  SORT AGGREGATE    |                      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| BXJ_HIGH_WATER_LEVEL | 10000 |   107   (0)| 00:00:02 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        375  consistent gets
          0  physical reads
          0  redo size
        422  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

2. Delete Record 对水位线的影响

Step1. 删除表中记录

DELETE FROM sh.bxj_high_water_level WHERE ROWNUM <= 9900;

Step2. 收集表的统计信息

BEGIN
   DBMS_STATS.gather_table_stats (‘SH‘,
                                  ‘BXJ_HIGH_WATER_LEVEL‘,
                                  cascade   => TRUE);
END; 

ANALYZE TABLE sh.bxj_high_water_level COMPUTE STATISTICS;

Step3. 表的统计信息和Block信息

SQL> select count(*) from sh.bxj_high_water_level;

Execution Plan
----------------------------------------------------------
Plan hash value: 4214873579

-----------------------------------------------------------------------------------
| Id  | Operation          | Name                 | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                      |     1 |   107   (0)| 00:00:02 |
|   1 |  SORT AGGREGATE    |                      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| BXJ_HIGH_WATER_LEVEL |   100 |   107   (0)| 00:00:02 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        375  consistent gets
          0  physical reads
          0  redo size
        422  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

3.  SHRINK SPACE CASCADE 对水位线的影响

Step1。合并控件

ALTER TABLE sh.bxj_high_water_level ENABLE ROW MOVEMENT;     

ALTER TABLE sh.bxj_high_water_level SHRINK SPACE CASCADE;   

ALTER TABLE sh.bxj_high_water_level DISABLE ROW MOVEMENT;  

Step2. 收集表的统计信息

BEGIN
   DBMS_STATS.gather_table_stats (‘SH‘,
                                  ‘BXJ_HIGH_WATER_LEVEL‘,
                                  cascade   => TRUE);
END; 

ANALYZE TABLE sh.bxj_high_water_level COMPUTE STATISTICS; 

Step3. 表的统计信息和Block信息

SQL> select count(*) from sh.bxj_high_water_level;

Execution Plan
----------------------------------------------------------
Plan hash value: 4214873579

-----------------------------------------------------------------------------------
| Id  | Operation          | Name                 | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                      |     1 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |                      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| BXJ_HIGH_WATER_LEVEL |   100 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          6  consistent gets
          0  physical reads
          0  redo size
        422  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

4. Truncate Table 对水位线的影响

Step1. Truncate 表

TRUNCATE TABLE sh.bxj_high_water_level

Step2. 收集表的统计信息

BEGIN
   DBMS_STATS.gather_table_stats (‘SH‘,
                                  ‘BXJ_HIGH_WATER_LEVEL‘,
                                  cascade   => TRUE);
END; 

ANALYZE TABLE bxj_water_level COMPUTE STATISTICS;

Step3. 表的统计信息和Block信息

SQL>  select count(*) from sh.bxj_high_water_level;

Execution Plan
----------------------------------------------------------
Plan hash value: 4214873579

-----------------------------------------------------------------------------------
| Id  | Operation          | Name                 | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                      |     1 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |                      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| BXJ_HIGH_WATER_LEVEL |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        421  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

六、案例 - 总结



(1). 高水线直接决定了全表扫描所需要的I/O开销

(2). delete操作不会降低高水位线,高水位线之下的所有块依然被扫描

(3). 使用truncate 会重置高水位线到0位

(4). 定期使用alter table tab_name shrink space cascade 有效减少该对象上的I/O开销

时间: 2024-10-18 21:26:09

[转]Oracle High Water Level高水位分析的相关文章

PLSQL_性能优化系列16_Oracle High Water Level高水位分析

2014-10-04 BaoXinjian 一.摘要 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至关重要的影响. 当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响. 1. 何谓高水位线 如前所述,类似于水库中储水的水位线.只不过在数据库中用于描述段的扩展方式. 可以将数据段或索引段等想象为一个从左到右依次排开的一系列块.当这些块

PLSQL_性能优化系列14_Oracle High Water Level高水位分析

2014-10-04 BaoXinjian 一.摘要 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至关重要的影响. 当使用delete 操作表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 本文给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响. 1. 何谓高水位线 如前所述,类似于水库中储水的水位线.只不过在数据库中用于描述段的扩展方式. 可以将数据段或索引段等想象为一个从左到右依次排开的一系列块.当这些块

Oracle—deallocate unused释放高水位空间(二)

deallocate unused :仅适用于释放HWM高水位以上的空间,而无法释放高水位以下的空间:比如对表预分配的空间 使用说明和方法,官方文档有说明,如下: Use the deallocate_unused_clause to explicitly deallocate unused space at the end of a database object segment and make the space available for other segments in the ta

Oracle 高水位(HWM: High Water Mark)

一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个Block里可以包含多个row. 1.2 区: 由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先ORACLE会分配一区的空间给这个表,随着不

Oracle高水位High Water Mark(HWM)简介

1.什么是高水位 高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件. 2.高水位对于检索的影响 假设我们有个表有2百万行数据存储在几个区中,假如我们删除一百万条数据.尽管数据区中的数据没有了,但是Oracle中占用的区的数据空间仍然不变,与原来二百万条数据占用的数据空间是一样的.当我们在数据库中执行查询时,Oracle仍会遍历所有的数据块,即便这些数据块中没有数据.从这个

Oracle 高水位(HWM)回收原理及操作方法

一.  高水位(HWM)及其产生原因 High Water Mark,HWM) 是Oracle(Segment)级别的概念.在仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低.具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位. 下图为一个Segment内高水位不断增长的示意图: 注:一个表在初次插入记录时,Oracle会为其分配Segment和block. 插入大量数据后,高水位线随之增长 当数据

[Oracle]高水位标记(HWM)

(一)高水位标记(High Water Mark,HWM)的概念 所谓高水位标记,是指一个已经分配的段中,已经使用的空间与未使用的空间的分界线.在表的使用过程中,随着数据的不断增多(insert),HWM不断向数据段未使用部分方向移动,而在删除数据(delete)的过程中,HWM并不会向反方向移动,即使删除全部数据,HWM依然不会改变.但是如果使用了truncate命令,则表的HWM会被重置为0. 图1.segment (二)高水位标记的影响 全表扫描要读出直到HWM标记的所有的属于该表的数据块

Oracle 高水位说明和释放表空间,加快表的查询速度

高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表需要的存储空间:表以数据块的形式存储在数据文件中,表的存储结构是:行×行数,如果知道了总共有多少行,每行的平均长度,两者相乘,再除于90%的使用率,那么就可以知道实际需要存储的空间: 表的存储结构; 从统计信息得出平均每行的长度和总共的行数,从而知道存储的SIZE: 查找表实际存储的空间:数据实际存

探究 Oracle 高水位对数据库性能影响

2016-08-11 陈龙 恩墨学院 探究 Oracle 高水位对数据库性能影响1大家好!我是来自云和恩墨的陈龙,目前主要负责Oracle技术支持工作.在我开始学习Oracle 的时候就听eygle老师说过,要想学好技术,一定要要多做实验,多做学习记录,理论与实践相结合,才能真正理解吸收那些知识,所以今天我想分享一下对Oracle高水位线与SQL访问性能相关性的研究体会.谈不上很深入的研究,只是想与大家分享我的Oracle学习过程,希望能与大家交流进步.之所以分享这个学习内容,是因为在我曾经经历