合并数据块的概念及命令
在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