shrink合并数据块--解决数据块碎片问题

来源:互联网 发布:淘宝摄影布光 编辑:程序博客网 时间:2024/05/16 01:04

合并数据块的概念及命令

在Oracle 数据块中,删除数据后不会降低HWM,造成大量空间的浪费。

自行手动合并碎片空间可以采用的方法有:重建表、move、shrink等等,其实底层实现都是通过匹配的insert和delete操作,重新构造表中的行。

move操作,不支持在线读/写,表在移动的过程中是锁定状态不能操作,表在移动后表上索引会失效,必须rebuild重建。

shrink命令可以避免move的产生的问题,shrink命令要求操作的表所在表空间必须为ASSM---自动段空间管理.

shrink_clause的限制条件---alter table sr_log shrink space;
========================================
1. 对cluster,cluster table,或具有Long类型列的对象 不起作用。
2. 不支持具有function-based indexes 或 bitmap join indexes的表
3. 不支持mapping 表或index-organized表。

4. 不支持compressed 表


实验:使用shrink命令合并数据块

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0    Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

select tablespace_name,segment_space_management from dba_tablespaces where tablespace_name='USERS';
TABLESPACE_NAME                SEGMEN
------------------------------ ------
USERS                          AUTO

SQL> show user    ---DBA用户
User is "bys"
SQL> create table test6 as select * from dba_objects;
Table created
SQL> analyze table test6 compute statistics;
Table analyzed
SQL> select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='TEST6';
  PCT_FREE   PCT_USED     BLOCKS AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ---------- ----------- ----------
        10                  1051         100          0
SQL> delete test6 where owner='SYS';
30870 rows deleted
SQL> select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='TEST6';
  PCT_FREE   PCT_USED     BLOCKS AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ---------- ----------- ----------
        10                  1051         100          0
SQL> commit;
Commit complete
SQL> analyze table test6 compute statistics;

Table analyzed

删除数据并重新分析表后,可以查询到表占用的BLOCK并未减少。

SQL> select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='TEST6';
 
  PCT_FREE   PCT_USED     BLOCKS AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ---------- ----------- ----------
        10                  1051         100          0
 
SQL> alter table test6 shrink space;     
alter table test6 shrink space

ORA-10636: ROW MOVEMENT is not enabled    -----需要先开启ROW MOVEMENT


shrink合并数据块后,表所占用的数据块明显减少。仅为原来一半。

SQL> alter table test6 enable row movement;

Table altered
SQL> alter table test6 shrink space;
Table altered
SQL> analyze table test6 compute statistics;
Table analyzed
SQL> select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='TEST6';
 
  PCT_FREE   PCT_USED     BLOCKS AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ---------- ----------- ----------
        10                   590         101          0