프린트 하기

OS 환경 : Oracle Linux 8.1 (64bit)

 

DB 환경 : Oracle Database 19.3.0.0

 

방법 : 오라클 19c bigfile과 smallfile 테이블스페이스의 extent 할당 단위 확인

일반적으로 smallfile 테이블스페이스를 많이들 사용하는데, 기본적으로 smallfile의 extent 할당 단위는 작은 크기의 extent가 할당되고 이후에 갈수록 큰 크기의 extent 할당받음
이런식으로 할당되는 방식이 아마도 적은 양의 데이터만 삽입할 때 큰 extent를 할당해서 공간을 낭비하지 않으려는 오라클의 의도가 아닐까 싶음
그리고 추가로 일반적으로 많이 사용하지 않는 bigfile 테이블스페이스에서는 extent가 어떻게 할당되는지도 확인해봄
smallfile 테이블스페이스처럼 작은 크기의 extent부터 순차적으로 할당할지, bigfile 테이블스페이스는 많은 양의 데이터를 담는다고 가정하고 만드니 처음부터 큰 extent를 할당할지 궁금해서 테스트해봄
그리고 예전에 어떤 책에서 extent 할당 단위를 확인하는 테스트를 본적이 있는데 정확히 어떤 책인지 기억나지 않아 직접 테스트해봄

 

 

테스트
사전 환경 구성
smallfile 테이블스페이스 extent 할당 단위 확인
bigfile 테이블스페이스 extent 할당 단위 확인

 

 

테스트
사전 환경 구성
block size 확인

1
2
3
4
5
SQL> show parameter block_size
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192

현재 8k 블록을 사용중임

 

 

테이블스페이스 생성

1
2
3
4
5
SQL>
drop tablespace small_ts including contents and datafiles;
drop tablespace big_ts including contents and datafiles;
create smallfile tablespace small_ts datafile '/oradata1/ORACLE19/small01.dbf' size 31g autoextend on;
create bigfile tablespace big_ts datafile '/oradata1/ORACLE19/big01.dbf' size 31g autoextend on;

구분하기 쉽게 bigfile 테이블스페이스는 big_ts로, smallfile 테이블스페이스는 small_ts라는 이름으로 생성함

 

 

테이블스페이스 속성 확인

1
2
3
4
5
6
7
8
9
10
11
12
SQL>
set lines 200 pages 1000
col tablespace_name for a20
col bigfile for a7
col segment_space_management for a10
select tablespace_name, bigfile, segment_space_management from dba_tablespaces
where tablespace_name in ('BIG_TS', 'SMALL_TS');
 
TABLESPACE_NAME      BIGFILE SEGMENT_SP
-------------------- ------- ----------
BIG_TS               YES     AUTO
SMALL_TS             NO      AUTO

BIG_TS는 bigfile로, SMALL_TS는 smallfile로 생성됨, 그리고 두 테이블스페이스 모두 assm을 사용함

 

 

샘플 테이블 생성

1
2
3
SQL>
create table small_tbl tablespace small_ts as select * from dba_objects;
create table big_tbl tablespace big_ts as select * from dba_objects;

구분하기 쉽게 bigfile 테이블스페이스의 테이블은 big_tbl로, smallfile 테이블스페이스의 테이블은 small_tbl이라는 이름으로 생성함

 

 

smallfile 테이블스페이스 extent 할당 단위 확인
먼저 smallfile 테이블스페이스에 생성된 small_tbl 테이블에 데이터 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> 
insert into small_tbl select * from small_tbl;
/
/
/
/
/
/
/
/
/
/
commit;
...
74122240 rows created.
Commit complete.
 
SQL> select count(*) from small_tbl;
 
  COUNT(*)
----------
 148262912

총 148,262,912건이 삽입됨

 

 

할당된 extent 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SQL> 
set lines 200 pages 1000
col segment_name for a20
col tablespace_name for a15
col extent_id for 999
col bytes for 9999999
select tablespace_name, segment_name, extent_id, bytes/1024 extent_size_kb
from dba_extents
where segment_name = 'SMALL_TBL'
order by extent_id;
 
TABLESPACE_NAME SEGMENT_NAME         EXTENT_ID EXTENT_SIZE_KB
--------------- -------------------- --------- --------------
SMALL_TS        SMALL_TBL                    0             64
SMALL_TS        SMALL_TBL                    1             64
..
SMALL_TS        SMALL_TBL                   16           1024
SMALL_TS        SMALL_TBL                   17           1024
..
SMALL_TS        SMALL_TBL                   79           8192
SMALL_TS        SMALL_TBL                   80           8192
..
SMALL_TS        SMALL_TBL                  199          65536
SMALL_TS        SMALL_TBL                  200          65536
..
SMALL_TS        SMALL_TBL                  533          65536
 
534 rows selected.

 

 

너무 많아서 count로 extent 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL>
set lines 200 pages 1000
col segment_name for a20
col tablespace_name for a15
col extent_id for 999
col bytes for 9999999
select tablespace_name, segment_name, blocks, bytes/1024 extent_size_kb, count(*)
from dba_extents
where segment_name = 'SMALL_TBL'
group by tablespace_name, segment_name, blocks, bytes/1024
order by extent_size_kb;
 
TABLESPACE_NAME SEGMENT_NAME             BLOCKS EXTENT_SIZE_KB   COUNT(*)
--------------- -------------------- ---------- -------------- ----------
SMALL_TS        SMALL_TBL                     8             64         16
SMALL_TS        SMALL_TBL                   128           1024         63
SMALL_TS        SMALL_TBL                  1024           8192        120
SMALL_TS        SMALL_TBL                  8192          65536        335

초기 64kb 크기의 extent를 16개 할당받고
이후 1024kb 크기의 extent를 63개 할당받고
이후 8192kb 크기의 extent를 120개 할당받고
이후 65536kb 크기의 extent를 계속 할당받음
참고로 blocks 컬럼에 테스트 db의 block size(kb)를 곱하면 extent_size_kb가 나옴
= 8(blocks) * 8(block size) = 64(extent_size_kb)
= 128(blocks) * 8(block size) = 1024(extent_size_kb)
= 1024(blocks) * 8(block size) = 8192(extent_size_kb)
= 8192(blocks) * 8(block size) = 65536(extent_size_kb)

 

 

이렇게 smallfile 테이블스페이스는 순차적으로 extent를 할당받음

 

 

bigfile 테이블스페이스 extent 할당 단위 확인
다음으로 bigfile 테이블스페이스에 생성된 big_tbl 테이블에 데이터 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL>
insert into big_tbl select * from big_tbl;
/
/
/
/
/
/
/
/
/
/
commit;
...
74122240 rows created.
Commit complete.
 
SQL> select count(*) from big_tbl;
 
  COUNT(*)
----------
 148262912

총 148,262,912건이 삽입됨

 

 

할당된 extent 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SQL> 
set lines 200 pages 1000
col segment_name for a20
col tablespace_name for a15
col extent_id for 999
col bytes for 9999999
select tablespace_name, segment_name, extent_id, bytes/1024 extent_size_kb
from dba_extents
where segment_name = 'BIG_TBL'
order by extent_id;
 
TABLESPACE_NAME SEGMENT_NAME         EXTENT_ID EXTENT_SIZE_KB
--------------- -------------------- --------- --------------
BIG_TS          BIG_TBL                      0             64
BIG_TS          BIG_TBL                      1             64
..
BIG_TS          BIG_TBL                     16           1024
BIG_TS          BIG_TBL                     17           1024
..
BIG_TS          BIG_TBL                     79           8192
BIG_TS          BIG_TBL                     80           8192
..
BIG_TS          BIG_TBL                    199          65536
BIG_TS          BIG_TBL                    200          65536
..
BIG_TS          BIG_TBL                    536          65536
 
537 rows selected.

 

 

너무 많아서 count로 extent 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SQL>
set lines 200 pages 1000
col segment_name for a20
col tablespace_name for a15
col extent_id for 999
col bytes for 9999999
select tablespace_name, segment_name, bytes/1024 extent_size_kb, count(*)
from dba_extents
where segment_name = 'BIG_TBL'
group by tablespace_name, segment_name, bytes/1024
order by extent_size_kb;
 
TABLESPACE_NAME SEGMENT_NAME         EXTENT_SIZE_KB   COUNT(*)
--------------- -------------------- -------------- ----------
BIG_TS          BIG_TBL                          64         16
BIG_TS          BIG_TBL                        1024         63
BIG_TS          BIG_TBL                        8192        120
BIG_TS          BIG_TBL                       65536        338

초기 64kb 크기의 extent를 16개 할당받고
이후 1024kb 크기의 extent를 63개 할당받고
이후 8192kb 크기의 extent를 120개 할당받고
이후 65536kb 크기의 extent를 계속 할당받음
참고로 blocks 컬럼에 테스트 db의 block size(kb)를 곱하면 extent_size_kb가 나옴
= 8(blocks) * 8(block size) = 64(extent_size_kb)
= 128(blocks) * 8(block size) = 1024(extent_size_kb)
= 1024(blocks) * 8(block size) = 8192(extent_size_kb)
= 8192(blocks) * 8(block size) = 65536(extent_size_kb)

 

 

bigfile 테이블스페이스도 smallfile 테이블스페이스와 같이 순차적으로 extent를 할당받음

 

 

결론 :
smallfile 테이블스페이스와 bigfile 테이블스페이스를 사용할때 extent를 동일하게 할당 받음

 

 

참조 :