ORACLE中表空间和表碎片的示例分析

64次阅读
没有评论

共计 5084 个字符,预计需要花费 13 分钟才能阅读完成。

这篇文章主要为大家展示了“ORACLE 中表空间和表碎片的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“ORACLE 中表空间和表碎片的示例分析”这篇文章吧。

表空间碎片率

idle  select a.tablespace_name,sqrt(max(a.blocks)/sum(a.blocks))*(100/sqrt(sqrt(count(a.blocks)))) FSFI
from dba_free_space a,dba_tablespaces b
where a.tablespace_name=b.tablespace_name
and b.contents not in (TEMPORARY , UNDO)
group by a.tablespace_name 
order by 2;
TABLESPACE_NAME FSFI
------------------------------ ----------
EAM 2.57604251ALM 20.1734462SYSAUX 22.2842767SYSTEM 23.7809729USERS 53.439579RECCAT 100ARCH 1007 rows selected.
idle  
123456789101112131415161718192021

数字越小,表空间碎片较多,当小于 30% 的时候说明碎片程度很可观了。

按照表空间显示连续的空闲时间

引用官方的一段话:

The ideal situation is to have one large free extent in your tablespace. The more extents of free space there are in the tablespace, the more likely you will run into fragmentation problems. The size of the free extents is also very important. If you have a lot of small extents (too small for any next extent size) but the total bytes of free space is large, then you may want to consider defragmentation options.

脚本中统计了连续空间及对连续空间求和,当表中的总的 free 空间很大时,但有很多小块,说明碎片化越严重。

========
Script : tfstsfgm
========SET ECHO off 
REM NAME:TFSTSFRM.SQL REM USAGE: @path/tfstsfgm  REM ------------------------------------------------------------------------ 
REM REQUIREMENTS: 
REM SELECT ON DBA_FREE_SPACE 
REM ------------------------------------------------------------------------ 
REM PURPOSE: 
REM The following is a script that will determine how many extents 
REM of contiguous free space you have in Oracle as well as the 
REM total amount of free space you have in each tablespace. From REM these results you can detect how fragmented your tablespace is. 
REM 
REM The ideal situation is to have one large free extent in your 
REM tablespace. The more extents of free space there are in the 
REM tablespace, the more likely you will run into fragmentation 
REM problems. The size of the free extents is also very important. 
REM If you have a lot of small extents (too small for any next REM extent size) but the total bytes of free space is large, then REM you may want to consider defragmentation options. 
REM ------------------------------------------------------------------------ 
REM DISCLAIMER: 
REM This script is provided for educational purposes only. It is NOT REM supported by Oracle World Wide Technical Support. 
REM The script has been tested and appears to work as intended. 
REM You should always run new scripts on a test instance initially. 
REM ------------------------------------------------------------------------ 
REM Main text of script follows: 
create table SPACE_TEMP ( 
 TABLESPACE_NAME CHAR(30), 
 CONTIGUOUS_BYTES NUMBER) 
/ 
declare 
 cursor query is select * 
 from dba_free_space 
 order by tablespace_name, block_id; 
 this_row query%rowtype; 
 previous_row query%rowtype; 
total number; 
begin 
 open query; 
 fetch query into this_row; 
 previous_row := this_row; 
 total := previous_row.bytes; 
 loop 
 fetch query into this_row; 
 exit when query%notfound; 
 if this_row.block_id = previous_row.block_id + previous_row.blocks then 
 total := total + this_row.bytes; 
 insert into SPACE_TEMP (tablespace_name) 
 values (previous_row.tablespace_name); 
 else 
 insert into SPACE_TEMP values (previous_row.tablespace_name, 
 total); 
 total := this_row.bytes; 
 end if; previous_row := this_row; 
 end loop; 
 insert into SPACE_TEMP values (previous_row.tablespace_name, 
 total); end; . 
/ 
set pagesize 60 set newpage 0 set echo off 
ttitle center  Contiguous Extents Report  skip 3 break on  TABLESPACE NAME  skip page duplicate 
spool contig_free_space.lis 
rem 
column  CONTIGUOUS BYTES  format 999,999,999 column  COUNT  format 999 column  TOTAL BYTES  format 999,999,999 column  TODAY  noprint new_value new_today format a1 
rem 
select TABLESPACE_NAME  TABLESPACE NAME , 
 CONTIGUOUS_BYTES  CONTIGUOUS BYTES  from SPACE_TEMP 
where CONTIGUOUS_BYTES is not null order by TABLESPACE_NAME, CONTIGUOUS_BYTES desc; select tablespace_name, count(*)  # OF EXTENTS , 
 sum(contiguous_bytes)  TOTAL BYTES  from space_temp 
group by tablespace_name; spool off 
drop table SPACE_TEMP 
/ 
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798

表空间级别整理方法

对于 ASSM 管理的表空间,一般都是由 smon 进程自动整理,前提是表空间的 pctincrease 值为非 0,可以将表空间的缺省存储参数 pctincrease 改为非 0,一般将其设为 1。如修改 temp 表空间的 pctincrease 属性:alter tablespace temp default storage(pctincrease 1); 这样就可以自动整理表空间级别的碎片整理了。

如果对于字典管理的表空间,可以用下面的命令进行整理: 
sql alter tablespace 表空间名 collesce;

表级别碎片整理方法 1. 首选 shrink

SQL  alter table t1 enable row movement; -- 打开行移动表已更改。 
SQL  alter table t1 shrink space cascade; -- 压缩表及相关数据段并下调 HWMSQL  alter table t1 shrink space compact; -- 只压缩不下调 HWMSQL  alter table t1 shrink space ; -- 下调 HWMSQL  alter table t1 disable row movement; -- 关闭行移动 1234567891011

只能在 ASSM、本地管理的表空间进行,完成这些之后不需要进行索引的重建,但统计信息最好重新收集下,脚本参加本博客上上篇。^_^

2. 导入导出

用 exp/imp 导出后,重新导入重建,在重新创建索引和重新收集统计信息。

3.CATS 技术

create table newtable as select * from old_table

drop old_table

rename table newtable to old_table

重建索引,收集统计信息。

4.move tablespace

sql  alter table  表名  move tablespace  表空间名 
重建索引,收集统计信息。123

以上是“ORACLE 中表空间和表碎片的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计5084字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)