Oracle 10g Shrink Table和Shrink Space使用详解

Oracle 10gShrink Table的使用是本文我们主要要介绍的内容,我们知道,如果经常在表上执行DML操作,会造成数据库块中数据分布稀疏,浪费大量空间。同时也会影响全表扫描的性能,因为全表扫描需要访问更多的数据块。从Oracle 10g开始,表可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

segment shrink分为两个阶段:

1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。Shrink Space语句两个阶段都执行。Shrink Space compact只执行***个阶段。

如果系统业务比较繁忙,可以先执行Shrink Space compact重组数据,然后在业务不忙的时候再执行Shrink Space降低HWM释放空闲数据块。shrink必须开启行迁移功能。

alter table table_name enable row movement ;

注意:alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,***执行一下utlrp.sql来编译无效的对象。

语法:

  1. alter table <table_name> shrink space [ <null> | compact | cascade ];  
  2. alter table <table_name> shrink space compcat; 

收缩表,相当于把块中数据打结实了,但会保持high water mark;

alter table <tablespace_name> Shrink Space;

收缩表,降低 high water mark;

alter table <tablespace_name> Shrink Space cascade;

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

alter index idxname Shrink Space;

回缩索引

1:普通表

Sql脚本,改脚本会生成相应的语句

  1. select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10)from user_tables;  
  2. select'alter index '||index_name||' shrink space;'||chr(10)from user_indexes; 

2:分区表的处理

进行Shrink Space时 发生ORA-10631错误.Shrink Space有一些限制.

在表上建有函数索引(包括全文索引)会失败。

Sql脚本,改脚本会生成相应的语句

  1. select 'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10) from user_tables where ;  
  2. select 'alter index '||index_name||' shrink space;'||chr(10) from user_indexes where uniqueness='NONUNIQUE' ;  
  3. select 'alter table '||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) from user_segments where segment_type='TABLE SUBPARTITION' '; 

Shrink的几点问题:

1. shrink后index是否需要rebuild:因为shrink的操作也会改变行数据的rowid,那么,如果table上有index时,shrink table后index会不会变为UNUSABLE呢?

我们来看这样的实验,同样构建my_objects的测试表:

  1. create table my_objects tablespace ASSM as select * from all_objects where rownum<20000;  
  2. create index i_my_objects on my_objects (object_id);  
  3. delete from my_objects where object_name like '%C%';  
  4. delete from my_objects where object_name like '%U%'; 

现在我们来shrink table my_objects:

  1. SQL> alter table my_objects enable row movement;  
  2. Table altered  
  3. SQL> alter table my_objects shrink space;  
  4. Table altered  
  5. SQL> select index_name,status from user_indexes where index_name='I_MY_OBJECTS';  
  6. INDEX_NAME STATUS  
  7. ------------------------------ --------  
  8. I_MY_OBJECTS VALID 

我们发现,table my_objects上的index的状态为VALID,估计shrink在移动行数据时,也一起维护了index上相应行的数据rowid的信息。我们认为,这是对于move操作后需要rebuild index的改进。但是如果一个table上的index数量较多,我们知道,维护index的成本是比较高的,shrink过程中用来维护index的成本也会比较高。

2. shrink时对table的lock

在对table进行shrink时,会对table进行怎样的锁定呢?当我们对table MY_OBJECTS进行shrink操作时,查询v$locked_objects视图可以发现,table MY_OBJECTS上加了row-X (SX) 的lock:

  1. SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;  
  2. OBJECT_ID SESSION_ID ORACLE_USERNAME LOCKED_MODE  
  3. ---------- ---------- ------------------ -----------  
  4. 55422 153 DLINGER 3  
  5. SQL> select object_id from user_objects where object_name = 'MY_OBJECTS';  
  6. OBJECT_ID  
  7. ----------  
  8. 55422 

那么,当table在进行shrink时,我们对table是可以进行DML操作的。

3.shrink对空间的要求

我们在前面讨论了shrink的数据的移动机制,既然oracle是从后向前移动行数据,那么,shrink的操作就不会像move一样,shrink不需要使用额外的空闲空间。

【编辑推荐】

  1. Oracle数据库包的构造过程实例
  2. Oracle数据库创建Schema的代码示例
  3. ORACLE GOLDENGATE的主要组件详解
  4. Python模拟Oracle的SQL/PLUS工具的实现方法
  5. Windows7安装Oracle database lite 10g的错误解决

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/252777.html<

(0)
管理的头像管理
上一篇2025-04-29 14:34
下一篇 2025-04-29 14:35

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注