SHRINK SEGMENT降低高水位

在线段收缩支持:LOB段,IOT溢出段;
使用在线段收缩回收HWM以下碎片的空闲空间,段收缩的好处:
更好的缓存使用率,提高OLTP的性能;
减少全表扫描的数量,提高DSS的性能;
段收缩是在线的,索引在段收缩期间维护,不要求额外的磁盘空间。
段收缩收回HWM以下和以上的未使用空间,而空间释放仅仅释放高水位以上的未使用空间。默认情况下,段收缩压缩段,调整高水位,释放空间。
使用段收缩前必须使用ALTER TABLE ... ENABLE ROW MOVEMENT启用行移动,因为段收缩要求行移动到新位置。
段收缩只能在本地管理ASSM表空间上执行,ASSM中所有的段除以下外均可收缩:
IOT映射表;
物化视图基于ROWID;
具有函数索引的表;
调用段收缩
调用段收缩前,查看顾问的发现和推荐。使用ALTER TABLE, ALTER INDEX, ALTER MATERIALIZED VIEW, ALTER MATERIALIZED VIEW LOG语句的SHRINK SPACE子句完成;
两个可选子句控制收缩操作的处理:
COMPACT:Oracle消除碎片并且压缩数据,但是推迟重设HWM并且释放空间。可以在非高峰期不带COMPACT执行SHRINK SPACE完成第二阶段。
CASCADE:使用该子句扩展段收缩到所有的依赖对象。可以运行DBMS_SPACE的OBJECT_DEPENDENT_SEGMENTS查看所有依赖于给定对象的段。
ALTER TABLE employees SHRINK SPACE CASCADE;
ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);
ALTER TABLE customers MODIFY PARTITION cust_P1 SHRINK SPACE;
ALTER TABLE cities SHRINK SPACE CASCADE;
ALTER TABLE cities OVERFLOW SHRINK SPACE;

Oracle 10g

语法:

alter table<table_name> shrink space [ <null> | compact | cascade ];

alter table <table_name> shrink space compcat;

收缩表,但会保持 high water mark; (这怎么理解?相当于没回缩?)

相当于把块中数据打结实了。没有变动hwm

alter table <table_name> shrink space;

收缩表,降低 high water mark;

alter table <table_name> shrink space cascade;

收缩表,降低 high water mark,并且相关索引也要收缩一下下。

### 含义 在达梦数据库中,水位(High Water Mark,HWM)是一个用于标记数据段(Segment)中数据填充程度的重要概念。它就像一个水位线,标识着数据文件中已经使用过的最大块地址。当向表中插入数据时,数据会从低地址块开始依次填充,随着数据的不断插入,水位会逐渐上升。例如,若最初表为空,水位处于数据段的起始位置;当插入数据后,水位会随着数据占用的块向上移动。这意味着水位以下的块都曾经被使用过,而水位以上的块则尚未被数据占用。 ### 影响 - **空间使用效率**:水位会对数据库的空间使用效率产生显著影响。当数据被大量删除时,虽然数据被移除,但水位通常不会自动下降。这就导致即使表中的实际数据量减少了,数据库仍然会认为水位以下的空间都已被使用,从而不会将这些空间重新分配给其他数据。例如,一个表原本占用了 100 个数据块,水位位于第 100 块,当删除了 80%的数据后,水位依然在第 100 块,那么剩余的 80 个块虽然没有实际数据,但也不会被系统重新利用,造成了空间的浪费。 - **查询性能**:水位还会影响查询性能。在进行全表扫描时,数据库会扫描水位以下的所有块,即使这些块中可能没有有效数据。这会增加不必要的 I/O 操作,延长查询时间。例如,在上述例子中,全表扫描时会扫描 100 个块,而实际上只有 20 个块中有数据,这无疑增加了系统的负担,降低了查询效率。 ### 处理方法 - **重建表**:可以通过重建表来降低水位。重建表的过程是先创建一个新的空表,然后将原表的数据插入到新表中,最后删除原表并将新表重命名为原表名。在达梦数据库中,可以使用以下 SQL 语句实现: ```sql -- 创建新表 CREATE TABLE new_table AS SELECT * FROM old_table; -- 删除原表 DROP TABLE old_table; -- 重命名新表 ALTER TABLE new_table RENAME TO old_table; ``` 重建表后,水位会被重置到新表的起始位置,从而释放未使用的空间,提空间使用效率和查询性能。 - **收缩表空间**:达梦数据库提供了收缩表空间的功能,可以通过执行以下 SQL 语句来收缩表空间: ```sql ALTER TABLESPACE tablespace_name SHRINK SPACE; ``` 该语句会尝试将表空间中未使用的空间释放出来,从而降低水位。需要注意的是,收缩表空间操作可能会对数据库的正常运行产生一定影响,因此建议在业务低谷期进行操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值