在表上进行频繁的DML操作可能会在表中留下作为片段的空间,oracle可以在表或索引上执行段收缩,收缩段可以使段中的空闲空间可用于表空间中的其他段,从而潜在地改善将来在段上的DML操作。为了确定哪些段将在段收缩中受益,可以调用段顾问来执行指定可能容易产生碎片的段上的增长趋势分析。如几个月内hr.employees表上的DML操作非常频繁,这样可以建立段顾问来监控hr.employees表。步骤为:
以下操作用具有DBA权限的用户,如sys将表hr.employees表修改为行移动
alter table hr.employees enable row movement;
建立段顾问分析hr.employees表,可以使用如下匿名的PL/SQL块
variable task_id number
declare
name varchar2(100);
descr varchar2(500);
obj_id number;
begin
name :='';
descr :='check HR.EMPLOYEES';
dbms_advisor.create_task ('segment advisor', :task_id,name,descr,null);
dbms_advisor.create_object ('name','TABLE','HR','EMPLOYEES',null,null,obj_id);
dbms_advisor.set_task_parameter(name,'RECOMMEND_ALL','TRUE');
dbms_advisor.execute_task(name);
end;
print task_id 假设task_id为6
执行完后可以通过dba_advisor_findings视图来查看段顾问所发现的内容,如:
select owner,task_id,task_name,type,message,more_info from dba_advisor_findings where task_id=6;
可以通过dba_advisor_recommendations视图查看提供了推荐的收缩操作以及该收缩操作潜在节省的空间,以字节为单位,如:
select owner,task_id,task_name,benefit_type from dba_advisor_recommendations where task_id=6;
可以在dba_advisor_actions 视图中直接找到执行收缩所需要的SQL,如:
select owner,task_id,task_name,command,attr1 from dba_advisor_actions where task_id=6;
对hr.employees表进行收缩
alter table hr.employees shrink space;
收缩操作不需要额外的磁盘空间,并且不会阻止在该操作期间对表的访问,除了在该操作在末尾用于释放未使用空间的非常短的时间外,这段
时间都会维持表上的所有索引。收缩表除了释放空间外,还可以改善缓存的利用率,还改善了完整表扫描的性能。但收缩表将不会在LOB段上
起作用,也不能在包含任何基于函数索引的表上执行收缩操作,因此重新组织表是更适当的方法,即对表进行重建或其他操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20444553/viewspace-1009419/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20444553/viewspace-1009419/