- 데이터를 꺼내고 집어넣을 때, 어떤 식으로 데이터가 보관되는 것이 유리할지 알아보자.
- 테이블 스페이스, 세그먼트, 익스텐트, 블록처럼 용어로 표현하면 어려운 개념들을 그림으로 살펴볼 것.
애플리케이션 개발 팀에서도 테이블이나, 인덱스의 생성과 생성 요청을 해야 하므로 어느 정도의 지식은 필요하다.
일반적인 운영에서 발생할 수 있는 에러의 대응에서도, 이런 용어들을 많이 사용하므로 데이터 구조는 반드시 이해해 두어야 한다.
오라클은 데이터를 관리하는 시스템이므로, 데이터를 어떻게 저장하고 있는지를 이해하는 것은 오라클을 알기 위해 절대 빼놓을 수 없는 부분이다.
💻💫 데이터 구조는 복잡하므로 어렵다고 느낄 수도 있지만, 이해할 때까지 몇 번이든 반복해서 학습하라!
- 테이블스페이스 (tablespace)
- 세그먼트(segment)
- 익스텐트(extent)
- 블록(block)
- 데이터 파일(datafile)
적당한 크기로 정한다(뭉친다)
- 관리를
어디서부터 어느 정도의 크기가 어던 테이블의 데이터인가?
라는 방식으로 하면,관리 정보
의 수를 줄일 수 있다.
1. 관리 및 I/O의 효율을 고려해 공간을 어느 정도의 크기로 뭉쳐서 할당한다.
2. 데이터 변경에 필요한 공간을 확보한다.
3. 비어 있는 공간을 관리한다.
데이터 파일: OS에서 보이는 물리구조
테이블: 여러 개의 로우를 갖고, OS에서 보이지 않는다는 의미로 논리적인 구조이다.
가장 작은 구조(집합): 오라클 블록이다.
블록: 8KB 같은 크기로 나누니 공간을 말한다.
- 블록 안에, 한 건 이상의 데이터가 보관된다.
테이블은 여러 개의 블록으로 구성된 것일까?
익스텐트라는 구조를 도입
각 익스텐트의 첫 위치와 블록의 개수
만으로 데이터를 관리할 수 있다.관리 정보도 줄일 수 있게 됨.
데이터를 한 번에 읽어올 수 있으므로, 테이블의 풀 스캔 성능을 향상할 수도 있다.
테이블이나 인덱스 등의 데이터를 한 번 더 모은 익스텐트의 집합을 '세그먼트'라고 부른다.
- 세그먼트는
많은 데이터를 보관하기 위한 구조
- 구조: 데이터베이스 내에 존재하고 있는 것처럼 보이기 때문이다.
- 세그먼트: 익스텐트의 집합
사용자용 세그먼트: 테이블, 인덱스 외
오라클이 자동으로 생성하는 세그먼트도 있다.
테이블
스페이스라고 부르긴 하지만, 세그먼트를 분류해서 보관하기 위한 상자
라고 생각하면 된다.
- 테이블스페이스의 집합(물리적으로는 데이터 파일의 집합)
- REDO로그 파일
- 컨트롤 파일이 모이면 하나의 데이터베이스가 된다.
데이터가 계속 삭제되어 블록 안의 공간이 늘어나면, 다시 해당 블록으로 데이터를 입력한다.
ROWID
라고 부른다.테이블스페이스에 테이블을 생성한다.
이 시점에서 내부가 비어있는 상태로 익스텐트가 생성된다.
PCTFREE
라는 임계치에 도달하면, 해당 블록에 입력하는 것을 멈추고, 이 블록에는 공간이 없다
고 인식한다.그리고 그 다음으로 비어있는 블록에 데이터를 입력한다.
데이터의 입력이 계속되어, 익스텐트가 가득 차게 되면, 테이블스페이스가 가지고 있는 빈 공간을 사용해 새로운 익스텐트를 테이블에 할당하고, 데이터를 입력할 수 있게 한다.
그 후 데이터를 삭제하여 PCTUSED
라는 임계치(ASSM일 때는 오라클이 자동으로 계산)보다 낮아지면, 다시 이 블록은 비어있다
고 인식하게 된다.
테이블이나 인덱스가 DROP(또는 TRUNCATE)되면, 익스텐트 안의 데이터는 불필요하므로, 테이블스페이스의 빈 공간으로 돌아간다.
데이터의 변경은 인덱스를 사용해 한 건만을 변경한다고 가정
우선 인덱스에 접근하고, 인덱스의 관리 정보를 토대로 인덱스의 루트 블록(가장 위의 블록)을 찾아간다.
캐시에 없으면, 블록을 읽어온다.
이어서 루트 블록에서 다음 블록의 주소를 조사하고, 그 블록이 캐시에 적재되어 있지 않다면 디스크에서 읽어온다.
대상 테이블 데이터의 블록이 캐시에 적재되어 있지 않다면, 해당 블록만을 읽어온다.
그리고, 캐시 상에서 블록의 데이터를 변경한다.
- 지금까지 설명한 처리는 서버 프로세스가 수행한다.
테이블스페이스는 세그먼트를 집어넣기 위한 용기로서 하나 이상의 데이터 파일로 구성된다.
일반적으로 테이블이나 인덱스는 세그먼트다.
세그먼트는 익스텐트로 구성되며, 익스텐트는 연속된 블록으로 구성되어 있다.
세그먼트는 테이블스페이스 여러 개에 걸쳐서 존재할 수 없다. (세그먼트는 테이블 스페이스에 소속되므로)
익스텐트는 데이터 파일 여러 개에 걸쳐 존재할 수 없다. (익스텐트는 연속된 블록이므로)
일반적으로 테이블이나 인덱스는 테이블스페이스가 가지고 있는 공간에서 새로운 익스텐트를 할당받음으로써 크기가 커진다.
블록 안의 데이터 변경용 공간은 PCTFREE라는 파라미터로 제어한다.
로우(행)은 블록에 보관되어 있다.
본문에서도 설명했듯, 익스텐트가 가득 차면 테이블스페이스가 가진 공간에서 세그먼트에 새로운 익스텐트를 할당한다.
이때는 익스텐트를 할당하지 못하며 에러가 발생한다.
- 운영 환경에서 테이블스페이스가 가진 여유 공간을 모니터링하는 것은 매우 중요한 작업이다.
여유 공간이 부족할 때에는 데이터파일을 추가하여 대처한다.
단, 데이터 파일을 자동 확장할 수 있도록 설정했다면, 상한선(ex: OS 파일의 크기 상한이나, 한 개의 데이터 파일에 넣을 수 있는 블록 수의 상한 등)에 도달하지 않은 이상, 자동으로 공간을 확장하기 때문에 공간이 부족하다고 해서 너무 서둘러 대응할 필요는 없다.
단, 파일 시스템의 여유 공간을 모니터링할 필요가 있으며, 큰 데이터 파일은 문제가 발생할 여지가 있으므로 너무 크게 할당하지 않는 편이 좋다.
이런 이유 때문에 관리용으로 사용하는 테이블스페이스(SYSTEM 테이블스페이스)에는 사용자용의 세그먼트를 생성해서는 안 된다.
잘못해서 SYSTEM 테이블스페이스가 가득 차게 되면, 데이터베이스 전체에 영향을 줄 수 있다.