티스토리 뷰
세그먼트(Segment)와 오브젝트(Object)
데이터베이스에서 공간은 테이블스페이스(Tablespace)를 의미합니다. 테이블스페이스에 저장되는 요소에는 테이블(Table), 인덱스(Index), 파티션(Partition) 등이 있습니다. 이렇게 데이터를 가지고 있는 요소들을 세그먼트(Segment)라고 합니다.
반면, 트리거(Trigger), 프로시저(Procedure), 함수(function)과 같이 데이터를 가지고 있지 않고 어떠한 코드만 가지고 있는 것을 오브젝트(Object)라 합니다. 오브젝트(Object)는 세그먼트(Segment) 보다 조금 더 큰 개념으로 오브젝트(Object)는 세그먼트(Segment)를 포함하고 있습니다.
또한, 오브젝트(Object)는 저장 공간을 할당하지 않은 객체들, 세그먼트(Segment)는 저장 공간을 할당 받은 객체들로 해석되기도 합니다.
세그먼트가 들어가는 테이블스페이스는 데이터 파일들(.dbf 혹은 .ora 확장자를 가진 파일)로 구성되어 있고, 이러한 데이터 파일은 OS상에서 볼 수 있습니다. 즉, 데이터 파일은 눈으로 볼 수 있다는 것입니다. 반면, 테이블스페이스는 논리적인 개념이기 때문에 OS상에서 볼 수 없습니다.
다음과 같은 명령어를 통해 전체 세그먼트(Segment) 목록을 확인할 수 있습니다.
-- 세그먼트 전체 목록 출력
desc dba_segments
-- 세그먼트 목록들의 세그먼트 타입 확인 (INDEX인지, TABLE인지, PARTITION인지, CLUSTER인지 등)
select distinct segment_type from dba_segments
오브젝트(Object) 역시 다음과 같은 명령어로 조회가 가능합니다.
-- 오브젝트 전체 목록 출력
desc dba_objects
-- 오브젝트 목록들의 오브젝트 타입확인(SEQUENCE, VIEW, DATABASE LINK, ...)
select distinct object_type from dba_objects
오브젝트 타입 확인 결과를 살펴보면 TABLE, INDEX 등의 세그먼트 타입에서 봤던 타입들도 존재합니다. 그래서 "TABLE이나 INDEX는 세그먼트 아닌가?"라고 생각하실 수 있습니다. 오브젝트 타입을 조회할 때 TABLE과 INDEX 등이 출력되는 이유는 앞서 말했듯, 오브젝트가 세그먼트를 포함하고 있기 때문입니다.
오브젝트 타입(Object Type)
위에서 살펴보았듯이, 오브젝트 타입에는 INDEX, PROCEDURE, CONTEXT 등 총 47가지의 타입이 존재합니다. 이 중 몇가지 타입에 대해서만 간략히 알아보겠습니다.
인덱스(INDEX)
테이블에 관한 INDEX 테이블을 구성하게 되면 데이터를 조회할 때 쿼리 성능을 빠르게 할 수 있습니다. 인덱스의 구조에는 B- Tree, B+ Tree, Hash, Bitmap 등과 같은 다양한 구조가 있습니다. 이 중 Bitmap 구조는 분포도가 좋지 않은 경우에 사용됩니다. 예를 들어, 성별에 대한 인덱스가 있다고 가정하겠습니다. 성별의 데이터 값은 '남, '여'만 갖게 됩니다. 따라서, 대용량의 테이블을 경우 '남자'인 인스턴스와 '여자'인 인스턴스가 매우 많을 것입니다. 이런 경우 인덱스를 걸어 "성별이 남자인 것을 찾아라"라고 한다면, 인덱스를 통해 테이블에서 대량의 데이터를 스캔해야 합니다. 어쩌면 인덱스를 타지 않는 풀스캔(Full-Scan)이 더 빠를 수도 있습니다. 이럴 때 사용하는 구조가 Bitmap 구조입니다. 이 Bitmap 인덱스는 트리 형태로 데이터를 찾아가는 방식이 아닌 Bitmap을 만들어 놓고 비교하는 방식을 사용하게 됩니다. 따라서, 대량 조회 시에 Bitmap 형태를 사용합니다. Bitmap Index에 대해서는 따로 정리해 두었으니 참고 부탁드립니다.
클러스터(CLUSTER)
데이터 테이블을 정렬된 형태로 저장하고 있는 요소입니다.
일종의 테이블인데 테이블의 저장을 블록 단위로 저장합니다. 예를 들어 설명하자면, 원래는 데이터를 들어온 순서대로 저장하지만 클러스터의 경우 A, B, C, D, ...의 알파벳을 분류하여 저장하는 것처럼 어떤 기준을 통해 데이터를 분류하여 저장하는 것입니다.
IOT(Index Organized Table)
IOT는 클러스터와 굉장히 비슷한 개념을 가지고 있습니다. 인덱스와 테이블을 붙여 놓은 구조입니다.
IOT는 조회를 빠르게 하기 위해 사용합니다. 기존의 인덱스와 테이블 구조에서는 인덱스를 한 번 타면, 해당 인덱스에 맞는 데이터를 찾기 위해 테이블을 참조하는 구조였다면, IOT는 인덱스를 한번 타게되면 안에 데이터가 전부 있기 때문에 별도로 테이블을 참조하지 않아도 되는 구조입니다.
뷰(VIEW)
뷰는 가상의 테이블 형태입니다. 예를 들어, A~Z까지의 Column을 가진 원본 테이블이 있다고 한다면, "나는 다 필요없고 A, C 이 2가지 Column만 필요하다"고 할 때 사용하는 것이 VIEW입니다.
뷰는 실제 데이터를 가지고 있진 않습니다. 뷰는 주로 성능보단 보안 이슈로 인해 사용합니다. 정말 중요한 데이터를 가지고 있는 Column을 노출 시키지 않고 몇 가지의 Column만 노출 시키도록 하여 보안성을 높일 수 있습니다.
뷰는 주로 보안 이슈 때문에 사용한다고 했지만, 성능 이슈 때문에도 사용할 수 있습니다. 이 때 사용하는 뷰는 위에서 언급한 일반적인 뷰와 조금 다른 뷰를 사용합니다. 바로 Materialized View입니다. Materialized View는 일반 뷰와 다르게 실제 데이터를 가지고 있는 뷰입니다. 따라서, 이 Materialized View를 조회하면 굳이 원본 테이블까지 가서 조회하지 않아도 되기 때문에 더 빠르게 데이터를 가져올 수 있습니다.
파티션(PARTITION)
만약, 100만 건 정도의 대용량 테이블이 있을 때 풀스캔(Full-Scan)을 한다면 속도가 느릴 수 밖에 없습니다. 이러한 성능 저하를 막기 위해 대용량의 테이블을 어떠한 기준(년, 월 등)으로 분할하여 원하는 정보만 조회할 수 있도록 하는 것을 파티션(PARTITION)이라고 합니다.
이러한 파티션은 테이블 관리를 목적으로 사용하기도 합니다. 만약 파티션을 사용하지 않았을 경우, 대용량의 테이블에서 10년 치 데이터만 보관하겠다고 한다면, 보관 기간이 10년을 넘는 데이터들을 일일이 조회해서 DELETE 해야 하기 때문에 작업 속도가 매우 느립니다. 하지만, 파티션을 이용할 경우 보관 주기를 설정하여 테이블을 분할하고 보관 기간이 10년이 넘는 파티션만 삭제하면 기존 방식보다 휠씬 빨리 DELETE 작업을 할 수 있습니다.
프로시저(PROCEDURE)
Oracle DB안에 프로그래밍을 넣을 수 있기 때문에 Oracle DB안에서 비즈니스 로직을 만드는 것이 가능합니다. 이 때 사용하는 것이 PL/SQL입니다. 즉, PL/SQL은 DB안에 들어가는 Programming Language를 의미합니다.
이 PL/SQL을 통해 PROCEDURE와 FUNCTION을 만들 수 있습니다. 만든 PROCEDURE와 FUNCTION은 SQL을 실행하듯, EXECUTE로 실행할 수 있습니다.
원래는 비즈니스 로직이 외부에 C나 JAVA로 만들어져 WAS(Web Application Server)에서 돌아가거나 하는데, 이러한 절차를 DB 내부에서도 구현할 수 있도록 한 것입니다.
트리거(Trigger)
트리거(Trigger)는 FUNCTION이나 PROCEDURE를 실행하는 조건을 걸어주는 것입니다. 즉, 이벤트가 발생할 때 FUNCTION이나 PROCEDURE를 실행시키는 것입니다.
예를 들어, TT PROCEDURE가 만들어져 있다고 한다면 "A 테이블에서 UPDATE 작업이 실행될 때, 자동으로 TT PROCEDURE를 실행해라"와 같이 트리거를 걸 수 있습니다.
“DB를 Shutdown할 때 어떤 행동을 취해라”, “사용자가 로그인 했을 때, 사용자 로그인 정보를 어떤 테이블에 저장해라” 와 같은 예시들도 있습니다.
초보 DBA를 위한 이것저것
[DB]세그먼트(Segment)와 오브젝트(Object)
[DB]파싱(Parsing)과 실행계획(Excution Plan)
참고
'Database > Oracle' 카테고리의 다른 글
[초보 DBA를 위한 이것저것]병렬 처리(Parallel Processing) (0) | 2024.11.01 |
---|---|
[초보 DBA를 위한 이것저것]파싱(Parsing)과 실행계획(Excution Plan) (0) | 2024.10.30 |
[초보 DBA를 위한 이것저것]Tablespace 공간 확장 및 이해 (0) | 2024.10.07 |
[초보 DBA를 위한 이것저것]Oracle DB의 메모리, 프로세서 구조 (0) | 2024.10.02 |
[오라클로 배우는 데이터베이스 개론과 실습]트랜잭션, 동시성 제어, 회복 (0) | 2024.09.20 |
- Total
- Today
- Yesterday