Oracle解决高水位线(high water mark 简称:HWM)​问题

栏目: 数据库 · Oracle · 发布时间: 6年前

内容简介:1.什么是高水位?(high water mark 简称:HWM)所有的Oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词)都有一个在段内存放数据的上线,那么我们把这个上线成为“high water mark”或HWM.HWM是一个标记,用来说明已经有多少没有使用的数据块分配给了这个segment。MWM通常增长的幅度为一次5个数据块。原则上MWM只会增大,不会缩小。即使表中的全部数据都删除了,那么HWM还是原值,不会变,由于这个特点,使得HWM就像一个水库的历史

高水位?(high water mark 简称:HWM)

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.那么如何降低高水位呢?

--方法一.

ALTER  TABLE  table_name MOVE ;--对表重建

ANALYZE  TABLE  table_name COMPUTE  STATISTICS ;--统计分析

注意:对表重建后记得重建表的所有索引

ALTER  INDEX  IDX_table_name  REBUILD ONLINE;

select index_name,status from user_indexes where table_name=upper('table_name');--查看索引状态是否生效

--方法二.

ALTER TABLE  table_name ENABLE ROW MOVEMENT;--激活行迁移

ALTER TABLE  table_name SHRINK SPACE;--激活表收缩

ANALYZE  TABLE  table_name COMPUTE  STATISTICS ;--统计分析

注意:如果是分区表,将row movement设置为enable,有可能发生行的物理移动,行的rowid会变化,某一行更新时,如果更新的是分区列,并且更新后的列值不属于原来的这个分区,如果开启了这个选项,就会把这行从这个分区中delete掉,并加到更新后所属的分区。相当于一个隐式的触发器,但不会触发Insert/delete触发器。如果没有开启这个选项,更新时就会报错。

在10g之后,整理碎片消除行迁移的新增功能shrink space

格式:alter table <table_name> shrink space [ <null> | compact | cascade ];

compact : 这个参数当系统的负载比较大时可以用,不降低HWM。如果系统负载较低时,直接用alter table table_name shrink space就一步到位了

cascade : 这个参数是在shrink table的时候自动级联索引,相当于rebulid index。

方法三:

CREATE TABLE table_name_1 AS SELECT  *  FROM  table_name;

TRUNCATE TABLE table_name;

INSERT INTO table_name SELECT * FROM table_name_1;

弊端:麻烦,耗时

方法四:

新建一个临时表,把数据复制到临时表,然后把源表drop掉,再把临时表重新命名为源表的名字。

弊端,主键.索引等依托于此表的对象需要重建

校验方法:

通过分析比对表块删除数据前后占用变化.

SELECT num_rows ,blocks, empty_blocks  FROM dba_tables WHERE owner='SDBMGR' AND table_name ='TABLE_NAME';

更多Oracle相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

Linux公社的RSS地址: https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-09/153908.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Algorithms for Programmers

Practical Algorithms for Programmers

Andrew Binstock、John Rex / Addison-Wesley Professional / 1995-06-29 / USD 39.99

Most algorithm books today are either academic textbooks or rehashes of the same tired set of algorithms. Practical Algorithms for Programmers is the first book to give complete code implementations o......一起来看看 《Practical Algorithms for Programmers》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具