Oracle - 断片化確認スクリプト
[質問]
各表領域がどのOBJECTにより使用されているか、
またどのブロックがフラグメンテーションをおこしているかを確認したい。
[回答]
以下のSQLをSQLPLUSより実行する事で、どのユーザセグメントが、どの表領域(データファイル)上に存在し、どれだけのBLOCKを獲得しているか、また各表領域のフラグメンテーションの状況を確認することができます。
(DBA_EXTENTS、DBA_FREE_SPACEを検索対象にしています。)
実行時には、spoolコマンドにてファイルに出力することをお勧めいたします。
---------cut---------------cut--------cut--------cut--------
spool chkspace
ttitle -
center 'Database Block Map' skip 2
col tablespace format a15 justify c trunc heading 'Tablespace'
col file_id format 990 justify c heading 'File'
col block_id format 9,999,990 justify c heading 'Block Id'
col blocks format 999,990 justify c heading 'Size'
col segment format a38 justify c trunc heading 'Segment'
break -
on tablespace skip page
select
tablespace_name tablespace,
file_id,
block_id,
blocks,
owner||'.'||segment_name segment
from
dba_extents
union
select
tablespace_name tablespace,
file_id,
block_id,
blocks,
'
from
dba_free_space
order by
1,2,3
/
spool off
----------- cut ---------------------- cut -------------- cut --------------
出力例:
Database Block Map
Tablespace File Block Id Size Segment
--------------- ---- ---------- -------- -----------------------------------
DES2 9 2 5 OWNER1.CDBL_ELEMENT
9 7 5 OWNER1.CDBL_OPERATIONS
9 12 5 OWNER1.CDBL_SESSION
9 17 5 OWNER1.CDB_ARCS
9 22 5 OWNER1.CDB_ASSOCIATIONS
9 27 5 OWNER1.CDB_ASSOCIATION_COMPONENTS
9 32 5 OWNER1.CDB_ELEMENTS
...
DES2_I 10 2 5 OWNER1.ACR_1
10 7 5 OWNER1.ACR_2
10 12 5 OWNER1.ACR_3
10 17 5 OWNER1.ACR_4
10 22 5 OWNER1.ACR_5
10 27 5 OWNER1.ACR_6
...
RBS 2 2 65 SYS.R01
2 67 65 SYS.R01
2 132 65 SYS.R02
2 197 65 SYS.R02
...
TEST 6 2 5
6 7 5 SCOTT.TEST2
6 12 15
6 27 5 SCOTT.TEST4
6 32 481
補足:未使用BLOCKについては、Segment列に "
上記の例では、TESTという表領域の2BLOCK目から5BLOCK、12BLOCK目から15BLOCKが
32BLOCK目からの481BLOCKは依然未使用の領域になります。