暂无图片
exp/imp怎样清除高水位?
我来答
分享
神武天尊
2022-04-24
exp/imp怎样清除高水位?

看网上说,oracle使用exp/imp能够清除表的高水位线,但我实际使用时却发现它并不能清除高水位线:例如原表做了delete操作,有1000个空块,然后对其进行exp导出,导出完成后删除这张表 drop table XX purge; 然后使用imp导入之前备份的表,经查仍然有1000个空块,高水位并没有降低。另外,我尝试使用expdp/impdp的方式,仍然没有把高水位降下来。

请问,关于exp/imp能清除高水位线的说法是真的吗?如果是真的,要怎样操作才能实现呢?

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
薛晓刚

假设你有1000w记录,删除了990万。你再进行导出导入。我不相信降不下来。

另外你可以采用shrink的方式回收表空间。

暂无图片 评论
暂无图片 有用 0
神武天尊
题主
2022-04-24
您说的是对的。但我们可能不在同一个频道上面啊。
cqiwen

我认为exp/imp能清除高水位线的说法是假的!官方文档中并没有找到类似的描述,这都是民间传说。

暂无图片 评论
暂无图片 有用 0
杨卓

正常情况如果你的表碎片很多,使用exp,expdp,shrink都是可以降低高水位线的。 但是还有其它额外的因素导致你看到的blocks无法降低:

1.表没有什么碎片,你说的1000个block free,是oracle extents申请的时候每次都是批量化申请,有可能就是一次性申请多个,然后有1000个free,就算drop table ,imp重新导入,只是还原这个操作而已!
这个可能性可以通过创建一个表空间,分配extens固定大小不使用oracle自扩展分配的机制进行排除

2.表中的行长度比较大,无法有效利用blocks的空间,做一个极端的假设,一个blocks 8k,一个行记录5k,那么一个blocks insert 时只能存储一行记录,那么blocks就存在大量的free无法重用;
这个比较麻烦可以通过分析行记录,调试blocks非标准块大小进行测试;
这个还有个PCTFREE相关的参数问题也要排除;

3.你说的空块的相关记录查询是否准确,是否受到统计信息的影响,如果查询的记录统计信息不准确是否干扰你的判断,这个可以测试收集统计信息操作对比结果进行排查

暂无图片 评论
暂无图片 有用 1
dbtiger

您好,exp/imp或者数据泵,这2套工具都属于逻辑导入导出。首先要理解逻辑备份和物理备份的区别,逻辑备份是基于sql语句将数据转化或存储为二进制文件,理解了这点,那是否能够真正降低高水位线就不攻自破了。

另外,也需要理解高水位的概念:
1.理论是dml操作产生了碎片未清理;
2.即使1做了,但是统计信息未及时触发更新,查看到的系统视图也不是最新数据。
基于上述这2个概念,就通透了。

暂无图片 评论
暂无图片 有用 2
cqiwen

看下我的实验数据再下结论吧:https://www.modb.pro/db/397933

其实我之前也觉得数据泵能降低高水位,但事实胜于雄辩,有些情况下此方法并不能清除高水位,具体原因不是很明朗。

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏