共計 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 行業資訊頻道!