表碎片的来源
当针对一个表的删除操作很多时,表会产生大量碎片。删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用。
首先收集表统计信息:
exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');
确定碎片程度:
select round((1-a.used/b.num_total)*100,0) percent from (SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) Used FROM 表名) a, (select blocks num_total from dba_tables where table_name='表名 and wner='用户名') b;
整理表碎片方法有两种
1.导出表,删除表再导入表。但这种方法不能在线而且需要重建索引
alter table move
2.表空间基于自动段管理 shrink命令。shrink 的优势在于不需要重建索引,可以在线操作。
启动行迁移:alter table table_name enable row movement ;
进行表的收缩:alter table table_name shrink space ;
再次收集统计信息exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');
3. 再次查看
select t.table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS from user_tables t
where table_name = upper('test_shrik');
4.最后关闭行移动
alter table TABLE_NAME disable ROW MOVEMENT;
阅读(2543) | 评论(0) | 转发(0) |