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를 동일하게 할당 받음
참조 :
'ORACLE > Admin' 카테고리의 다른 글
오라클 19c rac 환경에서 undo 사용률 확인시 주의사항 (0) | 2025.02.18 |
---|---|
오라클 23ai 신기능 xplan의 SQL Analysis Report (0) | 2025.02.03 |
오라클 23ai 신기능 xplan의 Hint Report 개선 (0) | 2025.01.27 |
오라클 AHF Fleet Insights 구성 가이드 (0) | 2025.01.12 |
Oracle 23ai New Features Part 2 (Oct 2024) (0) | 2025.01.01 |