ITPub博客

首页 > 数据库 > Oracle > 整理碎片1

整理碎片1

原创 Oracle 作者:li__hl8888 时间:2016-06-02 17:03:06 0 删除 编辑

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;

 
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> create index idx_t1_id on t1(object_id);
索引已创建。

SQL> exec dbms_stats.gather_table_stats('HR','T1',CASCADE=>TRUE);
PL/SQL 过程已成功完成。

1>估算表在高水位线下还有多少空间可用,这个值应当越低越好,表使用率越接近高水位线,全表扫描所做的无用功也就越少!
DBMS_STATS包无法获取EMPTY_BLOCKS统计信息,所以需要用analyze命令再收集一次统计信息

复制代码 代码如下:
SQL> analyze table t1 compute statistics;
2:估算表在高水位线下还有多少空间是无数据的,但在全表扫描时又需要做无用功的数据

复制代码 代码如下:

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博客 ” ,链接:https://blog.itpub.net/8568259/viewspace-2112982/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: DBMS_SYSTEM包
请登录后发表评论 登录
全部评论

注册时间:2011-06-01

  • 博文量
    208
  • 访问量
    92690