Oracle清理高水位线操作,创建大表测试

文章探讨了数据库中删除数据后水位线不下降的问题,以及如何通过分区表和expdp、impdp工具来释放表空间。在删除大量数据后,表和索引的大小并未减少,但通过导出导入操作可以有效地降低高水位线,释放空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库中经常会有delete数据,但是数据虽然删除,水位线并没有下降,所以查询不会因清理数据加快,表空间也并没有释放。

一般在建表前会考虑是否要经常清理表数据,若有需要则建立分区表;

但是很多情况下并没有长远考虑,或者字段没有时间分区,则可以采用expdp以及impdp的方式进行清理;

首先造一张3200万条数据的表:

-- 创建新表并批量插入100万条数据
create table TESTTABLE as 
select rownum as id,
               to_char(sysdate + ROWNUM/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
               trunc(dbms_random.value(0, 100)) as random_id,
               dbms_random.string('x', 20) random_string
          from dual
        connect by level <= 1000000;

这里再创建id字段为索引,查看清理高水位对索引的影响

 CREATE INDEX "WJZ"."PK_INDEX_ID" ON "WJZ"."TESTTABLE" ("ID") 

然后使用TESTTABLE表自己捣鼓几次到3200万条数据

insert into TESTTABLE
select t.id+16000000,t.inc_datetime,t.random_id,t.random_string from TESTTABLE t;

TESTTABLE 表数据量是3200万,表空间占用1920M,索引888M 

查询表大小: 

select owner,tablespace_name,SEGMENT_NAME ,segment_type,sum(BYTES/1024/1024) "sizes(MB)" 
from dba_segments where  owner='WJZ' 
group by owner,segment_name,segment_type, tablespace_name 
order by "sizes(MB)"  desc;

删除id>=10000的数据

delete from TESTTABLE t
where id>=12000000;

我的机器内存小,删除数据花了十几分钟,删除数据后查询表空间并没有变化;

 

再重新插入1200万条数据查看:

insert into TESTTABLE
select t.id+32000000,t.inc_datetime,t.random_id,t.random_string from TESTTABLE t;

表和索引占用的表空间没有增加,说明dml操作产生的空闲空间总是优先于扩展的空间使用;当然也有例外,比如以append方式insert数据。

 

 通过以下操作后,高水位线会释放;再查询表大小就降下来了。

导出、导入:

expdp wjz/password tables=TESTTABLE_BAK0621  directory=DATA_WJZ dumpfile=wjz0320_2.dmp job_name=wjz0320_2 logfile=wjz0320_2.log

impdp wjz/password tables=TESTTABLE_BAK0621  directory=DATA_WJZ dumpfile=wjz0320_2.dmp table_exists_action=replace job_name=wjz0320_2 logfile=impwjz0320_2.log

在expdp导出的时候可以看到数据预估有2.12G,这是占用表空间的大小,而实际导出后是1.15G大小。

 

参考文章:

Oracle实例之HWM(高水位线)性能优化 - 腾讯云开发者社区-腾讯云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大宇进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值