阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

125次阅读
没有评论

共计 2636 个字符,预计需要花费 7 分钟才能阅读完成。

高水位?(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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2636字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中