사전 테이블스페이스
개념

테이블스페이스

gabury1고친 사람 github-actions[bot]

테이블스페이스는 테이블을 디스크의 어느 공간에 담을지 이름 하나로 고르게 해 줍니다. 테이블을 만들 때 파일 경로를 적지 않고 이 이름을 적습니다. 그 이름 뒤에 어떤 파일이 있는지는 데이터베이스가 챙깁니다.

쉽고 빠른 이해

테이블과 디스크 파일 사이에 끼워 둔 이름표입니다. 빠른 디스크 위에 「빠른 공간」이라는 이름을 만들어 두고, 주문 테이블을 거기 넣으라고 적는 식입니다.

이게 없으면 모든 테이블이 데이터베이스가 정한 한 곳에 놓입니다. 디스크가 차거나 자주 읽는 테이블만 빠른 디스크로 보내고 싶을 때 손쓸 방법이 마땅치 않습니다.

이렇게 돕니다:

  1. 관리자가 디스크의 경로나 파일에 이름을 붙입니다
  2. 테이블을 만들 때 그 이름을 고릅니다
  3. 데이터베이스는 그 테이블의 데이터를 이름 뒤의 파일에 씁니다

대가는 돌볼 것이 늘어난다는 것입니다. 공간마다 얼마나 찼는지 따로 지켜봐야 합니다. 그 공간이 놓인 디스크가 사라지면 데이터베이스 전체가 흔들릴 수 있습니다.

상세

큰 물류 회사를 떠올려 봅니다. 직원은 물건을 「냉장 구역」에 넣으라고만 말합니다. 냉장 구역이 1번 창고에 있는지 2번 창고에 있는지는 창고 관리자가 압니다. 냉장 구역이 모자라면 관리자가 창고를 하나 더 붙입니다. 직원이 하는 말은 바뀌지 않습니다.

테이블스페이스(tablespace)는 데이터베이스가 데이터를 담을 저장 공간에 붙인 이름입니다. 담기는 것은 테이블과 인덱스처럼 디스크 공간을 차지하는 객체입니다. 인덱스는 값으로 행을 빨리 찾으려고 테이블 옆에 따로 만들어 두는 목록입니다.

예를 들면 이렇습니다. 관리자가 빠른 디스크 위에 fastspace 라는 테이블스페이스를 만듭니다. 개발자는 주문 테이블을 만들면서 「fastspace 에 둬라」라고만 적습니다. 주문 데이터가 어느 디렉터리의 어느 파일에 쓰이는지는 개발자가 몰라도 됩니다.

논리 구조와 물리 구조를 잇는 이름

데이터베이스를 보는 눈은 둘입니다. 하나는 개발자가 보는 눈입니다. 테이블이 있고 그 안에 행이 있습니다. 이것을 논리 구조라고 부릅니다.

다른 하나는 운영체제가 보는 눈입니다. 디스크 위에 파일과 디렉터리가 있을 뿐입니다. 이것을 물리 구조라고 부릅니다. 테이블스페이스는 이 둘 사이에 서서 「이 테이블은 저 파일들에 담긴다」를 이어 줍니다.

flowchart TD
    subgraph L["논리 구조 · 개발자가 보는 것"]
        T1["주문 테이블"]
        T2["주문 인덱스"]
        T3["옛 주문 기록 테이블"]
    end
    T1 --> S1["테이블스페이스 · fastspace"]
    T2 --> S1
    T3 --> S2["테이블스페이스 · archive"]
    subgraph P["물리 구조 · 운영체제가 보는 것"]
        F1["빠른 디스크의 파일"]
        F2["느린 디스크의 파일"]
    end
    S1 --> F1
    S2 --> F2

그림의 화살표는 모두 테이블스페이스를 거칩니다. 테이블은 파일을 직접 가리키지 않고 테이블스페이스 이름만 압니다.

이렇게 떼어 두면 저장 공간을 바꿀 때 테이블 정의를 건드리지 않습니다. 디스크가 차면 관리자는 테이블스페이스 뒤에 파일을 더 붙이거나 다른 디스크를 씁니다. 테이블을 만든 SQL(Structured Query Language, 구조화 질의 언어) 문장은 고칠 필요가 없습니다.

테이블스페이스로 하는 일

테이블스페이스를 나눠 두면 저장 공간을 묶음 단위로 다룰 수 있습니다. 쓰임은 크게 넷입니다.

쓰임 하는 일
공간 늘리기 디스크가 차면 다른 디스크에 테이블스페이스를 새로 만들어 그쪽에 데이터를 쌓는다
디스크 골라 쓰기 자주 읽는 인덱스는 빠른 디스크에, 거의 안 읽는 옛 기록은 싸고 느린 디스크에 둔다
용도 가르기 정렬 중간 결과나 되돌리기 기록(취소에 대비해 고치기 전 값을 적어 둔 것)처럼 잠깐 쓰는 공간을 일반 데이터와 떼어 둔다
공간 지켜보기 얼마나 찼는지를 테이블스페이스마다 보고 모자란 쪽만 늘린다

디스크 골라 쓰기는 디스크 성능이 고르지 않을 때 값을 합니다. 빠른 SSD(Solid State Drive, 반도체 저장 장치)는 비쌉니다. 자주 읽는 것만 거기 올리면 비싼 공간을 아끼면서 읽기는 빨라집니다.

용도 가르기의 되돌리기 기록은 트랜잭션을 취소할 때 씁니다. 트랜잭션은 함께 되거나 함께 안 돼야 하는 작업 묶음입니다. 취소되면 고치기 전 값으로 돌아가야 합니다. 이를 위해 데이터베이스는 고치기 전 값을 적어 둡니다.

이 기록이 언두 로그입니다. 언두 로그는 트랜잭션이 끝나면 머지않아 쓸모가 없어집니다. 대신 한 번에 많은 행을 고치는 작업이 돌면 갑자기 크게 불어납니다.

정렬 중간 결과도 비슷합니다. 정렬할 데이터가 메모리에 다 안 들어가면 데이터베이스는 나눠 정렬한 조각을 디스크에 잠깐 씁니다. 정렬이 끝나면 그 조각은 바로 버립니다.

둘 다 잠깐 쓰고 버리는 기록입니다. 그리고 언제 크게 불어날지 모릅니다. 일반 테이블과 한 공간에 있으면 불어날 때 일반 데이터가 쓸 자리까지 차지합니다. 그래서 이런 공간을 일반 데이터와 떼어 둡니다.

SQL 로 만들고 쓰는 모습

아래는 PostgreSQL 문법입니다. 테이블스페이스를 만들고, 테이블을 거기 두고, 테이블이 어디 놓였는지 묻는 세 단계입니다.

SQL
CREATE TABLESPACE fastspace
  LOCATION '/ssd1/pgdata';

CREATE TABLE orders (id int)
  TABLESPACE fastspace;

SELECT tablespace
  FROM pg_tables
 WHERE tablename = 'orders'; -- fastspace

첫 문장은 디렉터리 /ssd1/pgdata 에 fastspace 라는 이름을 붙입니다. 둘째 문장은 테이블을 만들면서 그 이름만 적습니다. 마지막 질의는 orders 가 fastspace 에 놓였다고 답합니다.

TABLESPACE 를 빼고 테이블을 만들면 기본 테이블스페이스에 들어갑니다. 따로 정하지 않았다면 PostgreSQL 에서는 pg_default 가 그 기본입니다. 그래서 테이블스페이스를 한 번도 안 만든 데이터베이스도 테이블스페이스 위에서 돌고 있습니다. 이름을 고를 일이 없었을 뿐입니다.

제품마다 다른 테이블스페이스의 범위

「저장 공간에 붙인 이름」이라는 뼈대는 같습니다. 그 이름 뒤에 무엇이 있느냐는 제품마다 다릅니다.

제품 이름 뒤에 있는 것 미리 갖춘 테이블스페이스
Oracle 데이터 파일 하나 이상 SYSTEM · SYSAUX 같은 시스템용, 임시 작업용, 되돌리기 기록용
PostgreSQL 디렉터리 하나 pg_default · pg_global

Oracle 에서는 테이블 하나가 여러 파일에 걸쳐 담길 수 있습니다. 테이블스페이스 뒤에 데이터 파일이 여럿 붙고, 테이블의 데이터는 그 파일들에 나뉘어 쌓입니다. 그래서 공간이 모자라면 테이블스페이스에 파일을 하나 더 붙입니다. 테이블은 손대지 않아도 그대로 커집니다.

이때 테이블이나 인덱스가 차지한 공간 한 덩어리가 세그먼트입니다. 세그먼트는 테이블스페이스 하나에만 속합니다. 그 테이블스페이스 안에서는 여러 데이터 파일에 나뉘어 담길 수 있습니다.

PostgreSQL 에서는 테이블스페이스가 디렉터리에 붙인 이름입니다. PostgreSQL 서버 하나에는 데이터베이스를 여럿 만들 수 있습니다. pg_default 는 앞에서 본 기본 테이블스페이스입니다. 데이터베이스를 만들 때 공간을 정하지 않으면 그 데이터베이스는 여기에 놓입니다.

pg_global 은 서버 안의 모든 데이터베이스가 함께 쓰는 시스템 카탈로그만 담습니다. 시스템 카탈로그는 테이블 목록 같은 데이터베이스 자신의 정보를 담은 테이블입니다.

스키마와 헷갈릴 때

스키마도 테이블을 묶습니다. 그래서 둘을 같은 것으로 읽기 쉽습니다. 묶는 기준이 다릅니다.

스키마는 이름을 묶습니다. shop.orders 처럼 테이블을 어느 이름 아래에서 부르는지와 누가 쓸 수 있는지를 정합니다. 테이블스페이스는 놓이는 곳을 묶습니다. 같은 스키마의 두 테이블이 서로 다른 테이블스페이스에 놓일 수 있습니다. 거꾸로 스키마가 다른 두 테이블이 한 테이블스페이스에 함께 놓일 수도 있습니다.

쓸 때와 안 쓸 때

테이블스페이스를 직접 나누는 쪽이 맞는 경우는 셋입니다. 성격이 다른 디스크가 여럿일 때, 한 디스크가 차서 다른 디스크로 넘겨야 할 때, 임시 작업이 일반 데이터의 공간을 잡아먹지 않게 막고 싶을 때입니다.

디스크가 하나뿐이면 나눌 까닭이 적습니다. 테이블스페이스를 여럿 만들어도 결국 같은 디스크에 놓이기 때문입니다. 이럴 때는 기본 테이블스페이스 하나로 둡니다.

나누면 돌볼 것이 늘어납니다. 테이블스페이스마다 남은 공간을 따로 지켜봐야 합니다. 어느 테이블이 어디 있는지도 기억해야 합니다.

디스크 하나를 잃을 때의 피해도 생각해야 합니다. PostgreSQL 에서 어느 테이블이 어느 파일인지 적은 목록은 시스템 카탈로그에 있습니다. 이 목록은 테이블을 옮겨 둔 테이블스페이스가 아니라 데이터베이스의 기본 공간에 남습니다.

그래서 테이블스페이스 디렉터리만 떼어 다른 서버에 붙여도 그 서버는 파일들이 어느 테이블인지 모릅니다. 그 디렉터리만 백업해 두는 것도 같은 까닭으로 소용이 없습니다. 거꾸로 테이블스페이스를 둔 디스크가 사라지면 목록은 남았는데 파일이 없어서 데이터베이스 전체가 제대로 돌지 못할 수 있습니다.

관련 항목

테이블스페이스에 담기는 객체

테이블 · 인덱스 · 세그먼트 · 파티션 · 임시 테이블 · 시스템 카탈로그

테이블스페이스 아래에서 공간을 이루는 단위

데이터 파일 · 익스텐트 · 데이터 블록 · 페이지 · 디렉터리 · 파일 시스템

용도에 따라 갈라 둔 테이블스페이스

시스템 테이블스페이스 · 언두 테이블스페이스 · 임시 테이블스페이스 · 테이블별 파일 · pg_global · pg_default

테이블스페이스를 둔 데이터베이스 제품

Oracle · PostgreSQL · MySQL · InnoDB · 스토리지 엔진 · 데이터베이스 관리 시스템

테이블스페이스와 맞물려 도는 저장 구조

언두 로그 · 리두 로그 · 버퍼 풀 · 데이터 디렉터리 · 데이터베이스 클러스터 · 물리 모델

테이블스페이스와 헷갈리는 이웃

스키마 · 데이터베이스 · 논리 모델 · 볼륨 · 디스크 파티션

다른 이름: tablespace · Tablespace