Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116150
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-12 15:22
个人简介

没有挫败,只有暂未成功而已。

文章分类

全部博文(28)

文章存档

2018年(28)

我的朋友

分类: Oracle

2018-10-26 16:04:53

表碎片的来源
当针对一个表的删除操作很多时,表会产生大量碎片。删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用。
首先收集表统计信息:
 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;
阅读(2461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~