1>整理SGA碎片
select count(*) from x$ksmsp
alter system flush buffer_cache
alter system flush shared_pool
2>整理表碎片.
SQL> alter table table_name enable row movement;
Table altered
SQL> alter table table_name shrink space compact;
Table altered
SQL> alter table table_name shrink space;
Table altered
3>整理索引碎片,重建索引:
alter index idx_t1_id rebuild online parallel 4;
Alter table table_name deallocate unused;
--在实际环境中执行的都超级快的执行完了
Alter table t1 deallocate unused;
5>对表空间进行碎片回收:
alter tablespace t1_indx coalesce;
alter tablespace t1_tbl coalesce;
6、回缩临时表空间,这好像也是10G 后增加的一个命令,很好用:
SQL> alter tablespace tempnew shrink space;
Tablespace altered
8、回缩回滚表空间:
月结结束后,回缩回滚表空间,盘上的空间也不多了
直接脱机、摘除数据文件都不可以
ALTER TABLESPACE "UNDOTBS1" OFFLINE FOR RECOVER;
ALTER TABLESPACE "UNDOTBS1" OFFLINE IMMEDIATE
提交失败: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机
---必须重建一个UNDO:
CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '/orachive/abc/undotbs02.dbf' SIZE 2048M RETENTION NOGUARANTEE;
CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '/orachive/abc/undotbs02.dbf' SIZE 2048M AUTOEXTEND ON NEXT 8K MAXSIZE UNLIMITED RETENTION GUARANTEE;
alter system set undo_tablespace=undotbs2;
drop tablespace undotbs1 including contents and datafiles; --注意对数据文件可不要用datafiles子句,最好是重命名一个文件,留着旧文件过一周时间没有问题了,再行删除!
ALTER TABLESPACE "UNDOTBS2" RETENTION NOGUARANTEE; --默认都是不 GUARANTEE 的
example:
索引已创建。
SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 过程已成功完成。
1>估算表在高水位线下还有多少空间可用,这个值应当越低越好,表使用率越接近高水位线,全表扫描所做的无用功也就越少!
DBMS_STATS包无法获取EMPTY_BLOCKS统计信息,所以需要用analyze命令再收集一次统计信息
SQL> SELECT TABLE_NAME,
2 (BLOCKS * 8192 / 1024 / 1024) -
3 (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
4 FROM USER_TABLES
5 WHERE table_name = 'T1';
3:对表进行碎片整理,重新收集统计信息
SQL> alter table t1 enable row movement;
表已更改。
SQL> alter table t1 shrink space cascade;
表已更改。
SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';
SUM(BYTES)/1024/1024
--------------------
.125
SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='IDX_T1_ID
';
SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 过程已成功完成。
这个时候,只剩下0.1M的无用功了,执行计划中,全表扫描也只需要消耗CPU 3
SQL> SELECT TABLE_NAME,
2 (BLOCKS * 8192 / 1024 / 1024) -
3 (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB"
4 FROM USER_TABLES
5 WHERE table_name = 'T1';
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8568259/viewspace-2112982/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8568259/viewspace-2112982/