表領域に作成されたセグメントの断片化が発生している状況を発生させ、それを解消させる手順を確認してみます。
create bigfile tablespace BIG_TBS datafile '/data/big_tbs.dbf' size 550m
extent management local
uniform size 1m
segment space management auto ;
まず、1つの大きな表領域を作成します。
自動セグメント領域管理とローカル管理が有効になっている550MBの表領域です。
またエクステントの割当て単位は1MBに設定しています。
set linesize 100 pagesize 100
col TABLESPACE_NAME for a15
col EXTENT_MANAGEMENT for a17
col ALLOCATION_TYPE for a15
col SEGMENT_SPACE_MANAGEMENT for a24
col BIGFILE for a7
select TABLESPACE_NAME, EXTENT_MANAGEMENT, ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT, BIGFILE
from DBA_TABLESPACES
where TABLESPACE_NAME = 'BIG_TBS' ;
TABLESPACE_NAME EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT BIGFILE
--------------- ----------------- --------------- ------------------------ -------
BIG_TBS LOCAL UNIFORM AUTO YES
作成した表領域の内容を確認しています。
create user test_user1 identified by password default tablespace BIG_TBS ;
alter user test_user1 quota 550m on BIG_TBS ;
grant CONNECT, RESOURCE to test_user1 ;
また、新たに作成した表領域をデフォルト表領域とするユーザーを作成します。
[oracle@db01 ~]$ sqlplus test_user1/password
SQL*Plus: Release 11.2.0.3.0 Production on 水 5月 11 00:33:06 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
作成したユーザーでログインし直します。
create table TAB1 (col1 number NOT NULL, col2 date, col3 varchar2(100), col4 varchar2(100)) ;
insert /*+append */ into TAB1
select LEVEL, SYSDATE+1/24/3600, rpad(to_char(LEVEL),100,'A'), rpad(to_char(LEVEL),100,'A')
from DUAL connect by LEVEL <= 402000 ;
commit ;
表の作成、テストデータの作成を行ないます。
これで、100MBの領域を利用するセグメントが作成されました。
create table TAB2 as select * from TAB1;
create table TAB3 as select * from TAB1;
create table TAB4 as select * from TAB1;
create table TAB5 as select * from TAB1;
create unique index PK_TAB1_COL1 on TAB1(COL1) ;
create unique index PK_TAB2_COL1 on TAB2(COL1) ;
create unique index PK_TAB3_COL1 on TAB3(COL1) ;
create unique index PK_TAB4_COL1 on TAB4(COL1) ;
create unique index PK_TAB5_COL1 on TAB5(COL1) ;
alter table TAB1 add primary key(COL1) using index;
alter table TAB2 add primary key(COL1) using index;
alter table TAB3 add primary key(COL1) using index;
alter table TAB4 add primary key(COL1) using index;
alter table TAB5 add primary key(COL1) using index;
また、作成した表の複製、インデックス、主キーの作成を行ないます。
exec dbms_stats.gather_schema_stats(ownname=>'test_user1');
set linesize 150 pages 5000
col SEGMENT_NAME for a24
select SEGMENT_NAME, BYTES/1024/1024 from USER_SEGMENTS order by 1;
SEGMENT_NAME BYTES/1024/1024
------------------------ ---------------
PK_TAB1_COL1 7
PK_TAB2_COL1 7
PK_TAB3_COL1 7
PK_TAB4_COL1 7
PK_TAB5_COL1 7
TAB1 100
TAB2 100
TAB3 100
TAB4 100
TAB5 100
作成したセグメントのサイズをディクショナリより確認します。
(100+7)*5=535MB利用されているのがわかります。
select TABLESPACE_NAME, FILE_ID, BLOCK_ID, BYTES/1024/1024
from USER_FREE_SPACE
where TABLESPACE_NAME = 'BIG_TBS' ;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES/1024/1024
------------------------------ ---------- ---------- ---------------
BIG_TBS 7 68608 14
また、空き領域も確認します。
550-535≒14MBの空き領域があることがわかります。
この状態から次回は断片化を発生させてみます。
create bigfile tablespace BIG_TBS datafile '/data/big_tbs.dbf' size 550m
extent management local
uniform size 1m
segment space management auto ;
まず、1つの大きな表領域を作成します。
自動セグメント領域管理とローカル管理が有効になっている550MBの表領域です。
またエクステントの割当て単位は1MBに設定しています。
set linesize 100 pagesize 100
col TABLESPACE_NAME for a15
col EXTENT_MANAGEMENT for a17
col ALLOCATION_TYPE for a15
col SEGMENT_SPACE_MANAGEMENT for a24
col BIGFILE for a7
select TABLESPACE_NAME, EXTENT_MANAGEMENT, ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT, BIGFILE
from DBA_TABLESPACES
where TABLESPACE_NAME = 'BIG_TBS' ;
TABLESPACE_NAME EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT BIGFILE
--------------- ----------------- --------------- ------------------------ -------
BIG_TBS LOCAL UNIFORM AUTO YES
作成した表領域の内容を確認しています。
create user test_user1 identified by password default tablespace BIG_TBS ;
alter user test_user1 quota 550m on BIG_TBS ;
grant CONNECT, RESOURCE to test_user1 ;
また、新たに作成した表領域をデフォルト表領域とするユーザーを作成します。
[oracle@db01 ~]$ sqlplus test_user1/password
SQL*Plus: Release 11.2.0.3.0 Production on 水 5月 11 00:33:06 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
作成したユーザーでログインし直します。
create table TAB1 (col1 number NOT NULL, col2 date, col3 varchar2(100), col4 varchar2(100)) ;
insert /*+append */ into TAB1
select LEVEL, SYSDATE+1/24/3600, rpad(to_char(LEVEL),100,'A'), rpad(to_char(LEVEL),100,'A')
from DUAL connect by LEVEL <= 402000 ;
commit ;
表の作成、テストデータの作成を行ないます。
これで、100MBの領域を利用するセグメントが作成されました。
create table TAB2 as select * from TAB1;
create table TAB3 as select * from TAB1;
create table TAB4 as select * from TAB1;
create table TAB5 as select * from TAB1;
create unique index PK_TAB1_COL1 on TAB1(COL1) ;
create unique index PK_TAB2_COL1 on TAB2(COL1) ;
create unique index PK_TAB3_COL1 on TAB3(COL1) ;
create unique index PK_TAB4_COL1 on TAB4(COL1) ;
create unique index PK_TAB5_COL1 on TAB5(COL1) ;
alter table TAB1 add primary key(COL1) using index;
alter table TAB2 add primary key(COL1) using index;
alter table TAB3 add primary key(COL1) using index;
alter table TAB4 add primary key(COL1) using index;
alter table TAB5 add primary key(COL1) using index;
また、作成した表の複製、インデックス、主キーの作成を行ないます。
exec dbms_stats.gather_schema_stats(ownname=>'test_user1');
set linesize 150 pages 5000
col SEGMENT_NAME for a24
select SEGMENT_NAME, BYTES/1024/1024 from USER_SEGMENTS order by 1;
SEGMENT_NAME BYTES/1024/1024
------------------------ ---------------
PK_TAB1_COL1 7
PK_TAB2_COL1 7
PK_TAB3_COL1 7
PK_TAB4_COL1 7
PK_TAB5_COL1 7
TAB1 100
TAB2 100
TAB3 100
TAB4 100
TAB5 100
作成したセグメントのサイズをディクショナリより確認します。
(100+7)*5=535MB利用されているのがわかります。
select TABLESPACE_NAME, FILE_ID, BLOCK_ID, BYTES/1024/1024
from USER_FREE_SPACE
where TABLESPACE_NAME = 'BIG_TBS' ;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES/1024/1024
------------------------------ ---------- ---------- ---------------
BIG_TBS 7 68608 14
また、空き領域も確認します。
550-535≒14MBの空き領域があることがわかります。
この状態から次回は断片化を発生させてみます。

コメント