关于降低高水位线的尝试

在前一段时间,生产环境中有几个很大的分区表,由于存在太多的碎片,导致表里的数据就几十条,但是查询的时候特别慢。很明显是高水位线导致的问题。
一般来说这类问题,使用备份->truncate->insert的方式比较保守,不适用于在线操作。
而在10g开始的一个新特性shrink算是一个比较理想的方案,按照新特性的预期,速度也是很快的,而且是在线操作。可以分批释放表中的冗余空间。
所以做了一个尝试,在生产系统中使用这个新特性来降低高水位线。
生产中的表pub_log,sub_log都是分区表,分区数不多,几十个左右。
首先使用shrink需要先设置表为enable rowmovement,这个操作会导致和这个表对应的包体失效。
可以使用shrink space compact先来压缩空间,然后在空闲时段使用shrink space来降低高水位线,但是shrink的操作对于基于函数的索引还是受限的。所以使用的时候需要考量一下。

需要降低高水位线的表是PUB_LOG,SUB_LOG,所在在简单准备之后,写了如下的脚本。
alter session force parallel ddl parallel 8;  --设置了并行
alter table PUB_LOG enable row movement;   --启用row movement
alter table PUB_LOG shrink space compact;   --先压缩表的空间
alter table PUB_LOG shrink space;        --降低表的高水位线
alter index PUB_LOG_PK shrink space compact;   --对索引也可以设置同样的操作。
alter index PUB_LOG_PK shrink space; 
alter table PUB_LOG disable row movement;  

alter table SUB_LOG enable row movement; 
alter table SUB_LOG shrink space compact; 
alter table SUB_LOG shrink space ; 
alter index SUB_LOG_PK shrink space compact; 
alter index SUB_LOG_PK shrink space; 
alter index SUB_LOG_1IX shrink space compact; 
alter index SUB_LOG_1IX shrink space ; 
alter table SUB_LOG disable row movement; 
在测试环境中做测试的时候,时间还是很快的,在5分钟以内完成了所有的操作。
然后脚本提交给客户去运行,结果晚上就接到电话,说第一步操作 alter table PUB_LOG shrink space compact 执行了快3个小时,还没有执行完。客户最后kill了那个session.
在第二天查这个问题的时候发现,在shrink space compact的同时,有几个session正在执行update,delete操作,执行还是比较频繁的。
看来shrink的操作还是需要谨慎,在生产环境中可能涉及的操作场景更为复杂。最后评估之后还是转为truncate的方式了。
truncate的操作步骤比较老套,但是在操作的时候还是有不少的细节。
首先是备份
可以使用exp/expdp的方式,如果数据量不大,可以采用使用表级备份。
我先尝试了exp的方式,结果发现还是有一些问题,表里只有68条数据,但是exp的时候,用了1分钟左右。
Export terminated successfully without warnings.
real    1m7.111s
user    0m0.104s
sys     0m0.065s

查看对应的索引情况,看来还是受到高水位线的影响。
INDEX_NAME                     TABLESPACE  INDEX_TYPE  UNIQUENES  PAR  COLUMN_LIST                     TABLE_TYPE STATUS   NUM_ROWS LAST_ANAL G
------------------------------ ---------- ---------- --------- --- ------------------------------ ---------- ------ ---------- --------- -

PUB_LOG_PK                                 NORMAL      UNIQUE     YES  BUFFER_ID,PUB_TRX_ID,SOURCE_COMP_ID TABLE      N/A            15 23-OCT-14 N

select count(*)from pub_log 速度也是很慢的。
因为索引是buffer_id开头,最后间接的使用索引,速度一下子就快了很多。
 select count(*)from trb1_pub_log where buffer_id in(select buffer_id from trb1_pub_log group by buffer_id);
  COUNT(*)
----------
        68
Elapsed: 00:00:00.17
最后转换为exp的方式,时间降低到5秒
time exp xxx/xxx tables=pub_log file=pub_log_bak.dmp query=\' where buffer_id in \(select buffer_id from pub_log group by buffer_id\)\' buffer=9102000 statistics=none grants=n indexes=n

real    0m5.064s
user    0m0.039s
sys     0m0.037s
到这一步其实也基本告一段落了,如果有些分区表含有lob字段,导出速度也还是会慢不少。
再次进行调整,发现使用表级备份还是不错的。
create table tmp_bak_pub_log nologging as select * from pub_log where buffer_id in (select buffer_id from pub_log group by buffer_id) ;
Elapsed: 00:00:01.69

create table tmp_bak_sub_log nologging as select * from sub_log where queue_id in (select queue_id from sub_log group by queue_id) ; --sub_log含有lob字段,exp也还是慢不少,使用表级备份就快多了。
Elapsed: 00:00:00.58

备份完成之后,就是truncate
truncate table pub_log reuse storage;
truncate table sub_log reuse storage;

最后insert即可。
insert into pub_log select *from tmp_bak_pub_log;
commit;

insert into sub_log select *from tmp_bak_sub_log;
commit;

总体来说,对于新特性的使用还是要做大量的测试,需要谨慎和保守,对于一些看似简单的操作也可以精工出细活。

时间: 2024-09-20 05:35:10

关于降低高水位线的尝试的相关文章

INITIAL参数设置导致TRUNCATE TABLE不能降低高水位线案例

在一个数据库使用下面SQL找出了一批需要降低高水位线的表,其中有几个表没有数据,于是我打算用TRUNCATE来降低高水位线HWM SELECT a.owner,        a.segment_name,        a.segment_type,        a.tablespace_name,        a.blocks              "real block",        a.bytes / 1024 / 1024 "realSizeMB&quo

Oracle 降低高水位线的方法

Oracle  降低高水位线的方法  高水位(HIGH WARTER MARK,HWM)好比水库中储水的水位,用于描述数据库中段的扩展方式.高水位对全表扫描方式有着至关重要的影响.当使用DELETE删除表记录时,高水位并不会下降,随之导致的是全表扫描的实际开销并没有任何减少. 例如,首先新建一张空表,大小占用64K,然后插入数据直到表大小变为50G,此时使用DELETE删除所有的数据并且提交,这个时候查询表的大小的时候依然是50G,这就是因为表的高水位没有释放的缘故,而在这时如果使用"SELEC

高水位线和全表扫描

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

oracle点知识——HWM(高水位线) 下

1.何时应该降低 HWM table中包含两种空闲的block,在HWM之上的空闲block 和 在HWM之下的空闲block. 1.在HWM之上的空闲block : 运行analyze table后,在HWM之上的空心啊block会在user_tables 的 empty_blocks中 被统计,这些空闲的blocks实际上是从来没有存储过数据的,可以用以下命令来释放这些空间: SQL>  alter table table_name  deallocate unused; 下面做一个实验来验

oracle点知识 ——HWM(高水位线) 上

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水.水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM).在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值.当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位.也就是说,这条高水位线在日

高水位线条款:中国基金激励的现实选择

在美国对冲基金中广泛应用的高水位线条款,如果能以适当的方式引入到我国开放式基金中,对促进我国开放式基金的发展或将起到很好的推动作用 文/李曜 史丹丹 在不到十年的时间里,美国的对冲基金从1000家迅速增长到7000家,资产规模在2007年时超过1.5万亿美元.为什么对冲基金如此成功? 西方学术界发现,对冲基金与公募基金的重要区别之一就是高水位线条款(high water marks, 以下简称HWM),这是以美国为代表的西方私募资产管理业,特别是对冲基金业管理费设计的一个关键技术条款.HWM条款

降低SQLSET相关表WRI$_SQLSET_PLAN_LINES高水位线,释放SYSAUX表空间

客户提出SYSAUX空间太大,已经占据了20多G的空间,登陆系统发觉SYSAUX表空间中占据TOP SEGMENT的主要就是WRI$_SQLSET_PLAN_LINES表 SQL> select *   2    from (select bytes / 1024 / 1024 / 1024, segment_name, owner, segment_type   3            from dba_segments   4           where tablespace_name

Oracle中Rollback&Truncate操作对高水位线影响:性能优化

Test 1. 创建一个用户leonarding并授予dba权限 SYS@LEO> create user leonarding identified by leonarding default tablespace users; SYS@LEO> grant dba to leonarding; 2. 创建一个t表,只要结构信息 SYS@LEO> conn leonarding/leonarding LEONARDING@LEO> create table t as select

Oracle的高水位线HWM简介

高水位是记录段里能容纳数据的上限,高水位存在段里 全表扫先读段头块,而后在段头块里面找到HWM 下面用实验由内而外来理解Oracle的HWM --t表有一条数据 hr@ORCL> select * from t; ID NAME ---------- ---------- 1 AAAAA --找t段的段头块 hr@ORCL> select header_file,header_block from dba_segments where segment_name='T' and owner='H