liguofeng29’s blog

個人勉強用ブログだっす。

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は依然未使用の領域になります。