暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle表碎片整理

在路上 2025-01-14
119

一、概念:

ORACLE用HWM来界定一个段中使用的块和未使用的块。创建一个表时,oracle会为这个对象分配一个段,第一区的第一个块被称为段头块(segment_header),

hwm信息就存储在此。hwm线之下表示用过的块,之上已分配从未使用。插入数据,现有空间不足进行扩展水位线向上移,但是删除数据不会往下移。

HWM通常增长幅度是一次5个数据块,如果使用truncate命令,HWM会重新置为0


二、shrink space

可以收缩高水位;索引不需要重建会自动维护;可以在线操作 不影响DML操作

alter table xx enable row movement; #开启表行迁移

alter table xx shrink space; #整理碎片并回收空间,两阶段,数据重组和HWM调整

alter table xx shrink space compact; #第一阶段数据重组,只整理碎片,不回收空间。

alter table xx shrink space cascade; #等同于不加参数的效果

alter table xx disable row movement; #关闭表行迁移


三、move table

高水位以下合并碎片,不移动高水位;move不能在线操作;move后索引失效需要重建;会阻塞DML

alter table xx move;

1.先逻辑备份待整理的表

2.对于大表,建议开启并行和nologging(减少生成redo,不生成undo)

alter table test move nologging parallel 2;

3.整理完重建索引

alter index xx rebulid nologging parallel 2;

4.恢复表和索引的并行度、logging

alter table test logging parallel 1;


四、create table XXX as select * from abb;

这个语句主要用于数据复制,并不直接整理原表的碎片


五、常见问题解答

问题1:发出一个全表扫描,oracle必须一直扫描到HWM吗?

解答:当执行一个全表扫描时,Oracle会读取从表的第一个数据块到HWM之间的所有数据块,即使表里没有数据。

问题2:数据库正常insert插入数据在hwm以下写入,如果在hwm以上插入数据怎么做?

解答:使用append,插入会在HWM上面插入,在高水位上分配空间,不会在表的空闲块中插入。

问题3:insert /*+ append */ 作用

解答:使用APPEND提示时,数据会直接在HWM之上分配新的数据块,并更新HWM。这意味着它不会尝试在表的空闲块中插入数据,而是直接跳过这些块。

问题4:append直接路径插入会减少redo吗

解答:直接路径插入会绕过Oracle的缓冲区缓存(Buffer Cache),直接将数据写入数据文件。这种写入方式减少了与缓冲区缓存相关的日志记录操作,从而减少重做日志的产生。

问题5:怎么减少日志的产生?

解答:归档模式下append+table nologging会大量减少日志,非归档模式下只要使用append就会大量减少日志。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论