今天在客户现场处理了一起空间碎片的问题。有问题的表空间已经使用97.1%,数据文件为自动扩展,但磁盘空间已经很紧张。整个表空间已经达到14G之多,另外,查询速度也是越来越慢。[@more@]
查询如下语句:
SQL> select tablespace_name "TABLESPACE",file_id,count(*) "PIECES", max(blocks) "MAXIMUM",min(blocks) "MinIMUM",avg(blocks) "AVERAGE",SUM(blocks) "TOTAL" from dba_free_space group by tablespace_name,file_id;
TABLESPACE FILE_ID PIECES MAXIMUM MinIMUM AVERAGE TOTAL
---------- -------- ------- ------- ------- ---------- -----
SMSCDRRPT 16 1 15600 15600 15600 15600
SMSCDRRPT 17 3 240 32 106.666667 320
SMSCDRRPT 18 2 15344 144 7744 15488
SMSCDRRPT 20 1 15856 15856 15856 15856
SMSCDRRPT 21 5 3072 16 704 3520
SMSCDRRPT 22 2 16112 6912 11512 23024
SMSCDRRPT 23 1 32496 32496 32496 32496
SQL> col FSFI for 999
SQL> select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) FSFI from dba_free_space group by tablespace_name order by 1;
TABLESPACE_NAME FSFI
------------------------- ----
CWMLITE 100
DRSYS 100
EXAMPLE 100
INDX 100
RMANTS 100
SMSCDMACDR01 100
SMSCDMACDR02 100
SMSCDMACDR03 100
SMSCDRRPT 28
SMSGSMCDR01 100
SMSGSMCDR02 100
TABLESPACE_NAME FSFI
------------------------- ----
SMSGSMCDR03 100
SYSTEM 100
TOOLS 100
UNDOTBS 17
USERINDEX 84
USERS 36
SQL> col owner for a5
SQL> col segment_name for a25
SQL>select owner, SEGMENT_NAME,TABLESPACE_NAME ,bytes/1024/1024 mb from dba_segments where tablespa;
OWNER SEGMENT_NAME TABLESPACE_NAME MB
----- ------------------------- ------------------------- ----------
SMS T_RPT_COUNT SMSCDRRPT 8378.00781
SMS T_RPT_COUNT_BACKUP SMSCDRRPT .0625
SMS T_CDR_FILE_REC SMSCDRRPT .0625
SMS T_C_FILELOAD SMSCDRRPT 39
SMS T_EMAIL_LIST SMSCDRRPT .0625
SMS IDX_T_PRPT_COUNT SMSCDRRPT 5483.00781
SMS IDX_T_RPT_COUNT_BACKUP SMSCDRRPT .0625
SMS PK_T_CDR_FILE_REC SMSCDRRPT .0625
SMS IDX_T_C_FILELOAD SMSCDRRPT 20
已选择9行。
SMSCDRRPT表空间的碎片问题还是很严重的,alter tablespace SMSCDRRPT coalesce好象只对范围起作用,但对段的碎片无能为力,表空间中有两最大的SEGMENT_NAME ,一个是表,达到8G多,另一个是索引,5G多。经沟通得知情况如下:T_RPT_COUNT 可以只保存最近三个月以来的数据,其它的都可以不保留:),如此一来,问题就非常容易处理了。
1、create table T_PRPT_COUNTNEW as select * from T_RPT_COUNT where ......取最近三个月的;
2、truncate T_PRPT_COUNT;
3、drop T_PRPT_COUNT;
3、rename T_PRPT_COUNTNEW to T_PRPT_COUNT;
做完之后,空间降为800M,用户非常^_^。