oralce move和shrink释放高水位
转自:https://blog.51cto.com/fengfeng688/1955137
move和shrink的共同点:
收缩段,消除部分行迁移,消除空间碎片,使数据更紧密
shrink用法:
语法:
alter table TABLE_NAME shrink space [compact|cascades]
shrink分为以下两个阶段:
1.数据重组(compact)
通过一系列的insert,delete操作,将数据尽量排列在段的前面。在这个过程中,需要在表上面加RX锁,即只在需要移动的行上加锁。由于涉及到ROWID的改变,因此需要启动行迁移,同时disable基于rowid的trigger,这一过程对表的影响比较小。
2.高水位(HWM)的调整
此过程需要在表上加X锁,会造成表上的所有DML语句阻塞,在业务比较繁忙的系统上可能会产生较大的影响
因此如果系统比较繁忙,可以先重组数据,再调整水位线
/*打开行迁移*/ alter table TABLE_NAME enable row movement; /*只整理碎片 不回收空间*/ alter table TABLE_NAME shrink space compact; /* 整理碎片并回收空间*/ alter table TABLE_NAME shrink space; /*整理碎片回收空间 并连同表的级联对象一起整理(比如索引)*/ alter table TABLE_NAME shrink space cascade; /*分区表的整理*/ alter table pt_table modify PARTITION P1 shrink space cascade;
shrink的优点:
可以在线执行
可以使用参数cascade同步收缩索引等
执行后不会导致索引失效
可以避免alter table move过程中对表空间的占用
move:
语法:
alter table table_name move tablespace new_tablespace; alter index index_name rebuild tablespace new_tablespace
move的优点:
可以修改表的初始storage参数,例如initial
使用move的注意事项:
表上面的索引需要重建,因为move后,rowid会发生变化,因此索引会失效
move表是会对表锁定,而且是exclusive lock
move时要保证新的表空间剩余量
move和shrink的区别
move后,表在表空间中的位置肯定会变,可能前移也可能后移,一般来说如果该表前面的表空间中有足够空间容纳该表,则前移,否则后移
hrink后,表在表空间中的位置肯定不变,也就是表的段头位置不会发生变化
Move会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作
shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作
使用move时,会改变一些记录的ROWID,所以MOVE之后索引会变为无效,需要REBUILD
使用shrink space时,索引会自动维护。如果在业务繁忙时做压缩,可以先shrink space compact,来压缩数据而不移动HWM,等到不繁忙的时候再shrink space来移动HWM
shrink可以单独压缩索引,alter index xxx shrink space来压缩索引。另外、压缩表时指定Shrink space cascade会同时压缩索引
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现