Oracle 手动增加表空间大小和整理表碎片

    技术2022-07-14  72

    查看表空间使用情况,增加表空间大小
    SELECT a.tablespace_name tablespace_name,'onilne', round(total / (1024 * 1024 * 1024), 2) "表空间大小(G)", round((total - free) / (1024 * 1024 * 1024), 2) "表空间使用大小(G)", round(free / (1024 * 1024 * 1024), 2) "表空间剩余大小(G)", round((total - free) / total, 4) * 100 "使用率 %" FROM (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) total FROM dba_data_files --注意所在用户权限,如果没有dba权限则用user_data_files表 GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name order by 6 desc;

    system和sysaux为数据库系统表空间,不用太注意。主要看TBS_DATA01 (数据库表的表空间,带_IDX是索引的表空间,也有可能没有,名字大家也可能各不相同)。当它使用率过高或者表空间剩余大小不足,则需要扩容 alter tablespace TBS_DATA01 add datafile size 31G; --最好有调度定期检查表空间是否足够,不足则自动扩容。
    查看表的使用状况,整理表碎片
    ------高水位 SELECT owner,TABLE_NAME,ROUND((BLOCKS*8192/1024/1024),2)"理论大小M", ROUND((NUM_ROWS*AVG_ROW_LEN/1024/1024),2)"实际大小M", ROUND( (BLOCKS * 8192 / 1024 / 1024) - (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024),2) "Data lower than HWM in MB" , to_char(round((NUM_ROWS*AVG_ROW_LEN/1024/1024)/(BLOCKS*8192/1024/1024),3)*100,'fm999990.99999')||'%' "实际使用率%" FROM dba_TABLES where (NUM_ROWS*AVG_ROW_LEN/1024/1024)/(BLOCKS*8192/1024/1024)<0.6 AND OWNER NOT IN ('SYS', 'SYSTEM', 'SYSMAN', 'DMSYS', 'OLAPSYS', 'XDB','EXFSYS', 'CTXSYS','WMSYS', 'DBSNMP', 'ORDSYS', 'OUTLN', 'TSMSYS', 'MDSYS','OGG') AND BLOCKS NOT IN ('0') ORDER BY 3 DESC; ------查看某表大小 SELECT bytes/1024/1024/1024 "单位G" FROM USER_SEGMENTS WHERE SEGMENT_NAME ='表名'; 若某些表实际使用率过低,则需要进行碎片整理。分区表需要单独整理每个分区,或者清除空分区。 --整理非分区表碎片 alter table TB_UTOWNERCLEARINGDETAIL move online; --整理分区表分区碎片 alter table TB_UTOWNERCLEARINGDETAIL move PARTITION SYS_P13236 online; alter table TB_UTOWNERCLEARINGDETAIL move PARTITION SYS_P13271 online; alter table TB_UTOWNERCLEARINGDETAIL move PARTITION SYS_P13278 online; --清除空分区 set serveroutput on; declare vsql varchar2(1000); vcount number; begin for i in(select * from user_tab_partitions a where a.table_name='TB_UTOWNERCLEARINGDETAIL' and a.partition_name<>'P1') loop vsql:='select /*+ parallel(8)*/ count(1) from TB_UTOWNERCLEARINGDETAIL partition('||i.partition_name||')'; execute immediate vsql into vcount; if vcount=0 then vsql:='alter table TB_UTOWNERCLEARINGDETAIL drop partition '||i.partition_name||';'; dbms_output.put_line(vsql); --执行该行的打印结果 end if; end loop; end; 整理完碎片后,若该表有索引则必须重建索引。 alter index IDX_OTHERTRANS_NEW_BATNO1 rebuild online; alter index IDX_OTHERTRANS_NEW_EXTIME1 rebuild online; 以上步骤结束,必须做表分析,避免数据库出现异常。 begin dbms_stats.gather_table_stats( ownname=>'CMMUSERDEV', --该表用户 tabname=>'RD_EXPASS_NEW', --表名 degree => 8, cascade => true, force=>true); end;
    Processed: 0.064, SQL: 9