본문으로 건너뛰기

클러스터링과 데이터 지역화

정보처리기사 목차물리 데이터베이스 설계레슨 112 / 233

목차

클러스터링은 함께 읽는 일이 잦은 행들을 같은 디스크 블록에 모아 저장하는 것입니다. 블록은 디스크가 한 번에 읽고 쓰는 단위이고, 모아 두면 같은 데이터를 꺼내는 데 읽는 블록 수가 줄어듭니다.

디스크는 행 하나씩 읽지 않습니다. 행 하나가 필요해도 그 행이 든 블록을 통째로 가져옵니다. 이 블록은 디스크가 한 번에 주고받는 자리의 크기이고, 앞 단원에서 BEGIN … END;로 묶은 절차형 SQL 블록과는 이름만 같습니다. 그래서 질의의 빠르기는 '몇 행을 읽나'보다 '몇 블록을 읽나'로 정해집니다. 학과명과 그 학과 학생을 함께 꺼내려면 학과 표와 학생 표를 이어야 하는데, 두 표가 다른 블록에 있으면 블록을 두 번 읽습니다(조인). 아래 그림은 흩어져 있던 행이 같은 블록으로 모여 읽는 블록 수가 줄어드는 모습을 보입니다.

6단계 중 1단계. 디스크는 행 하나씩 읽지 않고 정해진 크기의 블록 단위로 읽습니다. 한 행이 필요해도 그 행이 든 블록을 통째로 가져옵니다.

1클러스터 키가 같은 행을 한 블록에 모은다

함께 읽는 행들이 공통으로 가진 값을 클러스터 키로 정합니다. 학과 표와 학생 표를 함께 읽는다면 두 표에 모두 있는 학과코드가 클러스터 키입니다.

클러스터 키가 같은 행은 표가 달라도 한 블록에 섞여 들어갑니다. 학과 CS 행과 학과코드가 CS인 학생 셋이 한 블록에 담깁니다. 그 뒤로는 CS 학과와 그 학생을 꺼낼 때 블록을 한 번만 읽습니다.

이렇게 함께 쓰는 데이터를 가까운 자리에 모으는 일을 데이터 지역화라 합니다. 클러스터링이 그 방법 가운데 하나입니다.

인덱스에서 배운 클러스터드 인덱스와 이름이 닮았지만 다른 것입니다.

가르는 기준클러스터클러스터드 인덱스
무엇을 모으나클러스터 키가 같은 행한 표의 모든 행
어떻게 두나같은 블록에 섞어 담는다키 순서로 줄 세워 저장한다
표 여럿을 함께그렇다아니다, 한 표뿐

2모아 두기가 손해가 될 때

  • 넣기가 잦은 표: 한 키에 몫으로 잡아 둔 자리가 차면 넘친 행을 다른 블록에 두고 이어 두어야 해서, 읽을 때 블록을 또 한 번 더 읽습니다.
  • 클러스터 키를 고치는 일이 잦은 표: 키 값이 바뀌면 행이 다른 블록으로 옮겨 가야 합니다. 보통 열의 값을 고치는 것보다 비쌉니다.
  • 한 표만 전부 읽는 질의가 잦을 때: 블록 안에 다른 표의 행이 섞여 있어, 한 표만 훑으면 쓰지 않는 행까지 읽습니다.

그래서 클러스터링은 '함께 읽는 일이 잦고 값이 잘 바뀌지 않는' 짝에만 씁니다. 조건에 맞는 몇 행만 자주 찾는 쓰임이라면 클러스터링보다 인덱스가 맞습니다.

3모아 두기가 통하는 까닭 — 지역성

데이터 접근은 고르게 흩어지지 않고 쏠립니다. 이 쏠림을 지역성이라 하고, 쏠리는 방향에 따라 셋으로 가릅니다.

지역성쏠리는 방향보기
시간 지역성한 번 쓴 데이터를 짧은 시간 안에 다시 쓴다같은 학과 행을 학생마다 다시 읽는다
공간 지역성쓴 데이터의 가까운 자리를 함께 쓴다한 블록을 읽어 그 안의 학생 셋을 모두 쓴다
순차 지역성저장된 차례대로 이어서 읽는다표를 처음부터 끝까지 훑는다

순차 지역성은 '가까운 자리를 쓴다'의 좁은 경우라, 자료에 따라 공간 지역성에 넣어 둘로만 가르기도 합니다.

지역성이 없다면 모아 두기는 쓸모가 없습니다. 어느 행을 읽을지 전혀 쏠리지 않는다면 어떻게 모아 두어도 읽는 블록 수는 같습니다. 거꾸로 지역성이 클수록 블록 하나를 읽어 쓰는 행이 많아집니다.

예제

결과 표는 Oracle에서 돌린 결과입니다. 클러스터를 만드는 문법은 DBMS마다 다르고, 아래는 Oracle의 꼴입니다. 블록마다 처음 데이터에서 시작합니다 — 앞 블록이 만들거나 바꾼 것은 남아 있지 않습니다.

두 표를 한 클러스터에 담기

클러스터를 만들고, 클러스터 키에 인덱스를 만든 뒤, 두 표를 그 클러스터에 담습니다. 그러고 나서 학과코드가 CS인 행이 몇 블록에 흩어져 있는지 셉니다. ROWID의 7번째 자리부터 아홉 자가 그 행이 든 파일과 블록을 가리킵니다.

CREATE CLUSTER 학과묶음 (
  학과코드 VARCHAR2(10 CHAR)
) SIZE 1024;
CREATE INDEX 학과묶음_IX
  ON CLUSTER 학과묶음;
CREATE TABLE 학과_C (
  학과코드 VARCHAR2(10 CHAR),
  학과명 VARCHAR2(10 CHAR)
) CLUSTER 학과묶음 (학과코드);
CREATE TABLE 학생_C (
  학번 NUMBER,
  학과코드 VARCHAR2(10 CHAR)
) CLUSTER 학과묶음 (학과코드);
INSERT INTO 학과_C
SELECT 학과코드, 학과명
FROM 학과;
INSERT INTO 학생_C
SELECT 학번, 학과코드
FROM 학생;
SELECT COUNT(DISTINCT 블록)
    AS 블록수
FROM (
  SELECT SUBSTR(ROWID, 7, 9)
      AS 블록
  FROM 학과_C
  WHERE 학과코드 = 'CS'
  UNION ALL
  SELECT SUBSTR(ROWID, 7, 9)
  FROM 학생_C
  WHERE 학과코드 = 'CS'
);
블록수
1

학과 CS 행과 CS 학생 셋이 모두 한 블록에 있습니다. SIZE 1024는 클러스터 키 하나에 몫으로 잡아 둘 바이트입니다. 이 자리가 차면 넘친 행을 다른 블록에 두게 됩니다. CLUSTER 학과묶음 (학과코드)가 '이 표의 학과코드를 클러스터 키로 쓴다'는 뜻입니다.

클러스터 인덱스를 빠뜨리면

클러스터 키에 인덱스가 없으면 행을 넣을 수 없습니다. Oracle은 ORA-02032 오류를 냅니다.

CREATE CLUSTER 학과묶음 (
  학과코드 VARCHAR2(10 CHAR)
) SIZE 1024;
CREATE TABLE 학과_C (
  학과코드 VARCHAR2(10 CHAR),
  학과명 VARCHAR2(10 CHAR)
) CLUSTER 학과묶음 (학과코드);
INSERT INTO 학과_C
SELECT 학과코드, 학과명
FROM 학과;

클러스터는 키 값으로 블록을 찾아가는 구조라, 키에서 블록을 찾는 인덱스가 먼저 있어야 합니다.

시험 포인트

  • 필기: 디스크는 블록 단위로 읽으므로 질의의 빠르기는 읽는 블록 수로 정해집니다. 클러스터링은 클러스터 키가 같은 행을 한 블록에 모아 읽는 블록 수를 줄이는 것이고, 표가 달라도 한 블록에 섞어 담습니다. 함께 쓰는 데이터를 가까이 모으는 일을 데이터 지역화라 합니다. 넣기와 키 고치기가 잦은 표, 한 표만 전부 읽는 질의가 잦은 표에는 맞지 않습니다. 클러스터드 인덱스는 한 표의 행을 키 순서로 줄 세우는 것이라 다릅니다. 지역성은 시간·공간·순차 셋이고, 뜻과 이름을 짝짓는 문제로 나옵니다.
  • 실기: 이름은 클러스터링(Clustering), 시간 지역성(Temporal Locality), 공간 지역성(Spatial Locality), 순차 지역성(Sequential Locality)으로 씁니다.

확인 문제

1. 학생 표와 수강 표를 함께 읽는 일이 잦아 두 표를 한 클러스터에 담으려 합니다. 클러스터 키(cluster key)로 알맞은 것을 고르세요.

  • ① 학번
  • ② 이름
  • ③ 점수
  • ④ (학번, 과목코드)
정답

①입니다. 클러스터 키는 함께 읽는 행들이 공통으로 가진 값이어야 합니다. 학번은 두 표에 모두 있어, 같은 학번의 학생 행과 그 학생의 수강 행이 한 블록에 모입니다.

  • ② 이름은 학생 표에만 있습니다. 수강 행이 어느 블록으로 가야 할지 정할 수 없습니다.
  • ③ 점수는 수강 표에만 있고, 학생 행을 담을 자리를 정하지 못합니다.
  • ④ 수강 표의 기본키라서 골랐습니다. 기본키와 클러스터 키는 다른 것이고, 과목코드는 학생 표에 없어 두 표에 함께 쓸 수 없습니다.

2. 다음 (가)~(라)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 함께 읽는 일이 잦은 두 표의 행을, 공통인 값이 같은 것끼리 한 디스크 블록에 섞어 담았습니다.
  • (나) 반복문이 배열의 0번부터 끝까지 차례로 훑습니다. 다음에 읽을 자리가 바로 앞에 읽은 자리의 다음입니다.
  • (다) 방금 읽은 환율 값을 같은 화면을 그리는 동안 네 번 더 읽습니다.
  • (라) 블록 하나를 읽어 왔는데, 그 안에 든 이웃한 행 셋이 모두 이 질의에 쓰입니다.
정답

받는 답: (가) 클러스터링(Clustering) · (나) 순차 지역성(Sequential Locality) · (다) 시간 지역성(Temporal Locality) · (라) 공간 지역성(Spatial Locality)

(가)의 실마리는 '공통인 값이 같은 행을 한 블록에 담았다', (나)는 '저장된 차례대로 다음 자리를 읽는다', (다)는 '같은 값을 짧은 시간 안에 다시 읽는다', (라)는 '읽은 자리의 가까운 자리를 함께 쓴다'입니다.

  • 틀리는 꼴 공간 지역성 — (나)에: 가까운 자리를 함께 쓰는 쏠림입니다. (나)는 차례대로 이어서 읽는 좁은 경우라, 둘로만 가르는 자료에서는 공간에 넣기도 합니다. 셋으로 가를 때는 순차입니다.
  • 틀리는 꼴 시간 지역성 — (라)에: 같은 데이터를 다시 쓰는 쏠림입니다. (라)는 다른 행 셋을 쓴 것입니다.
  • 틀리는 꼴 파티셔닝 — (가)에: 한 표의 행을 기준값으로 여러 조각에 나눠 담는 것입니다. (가)는 두 표의 행을 한자리에 모았습니다.

3. 클러스터로 묶지 않은 원래 학과 표와 학생 표에 같은 방법으로 블록 수를 세면 얼마가 나오는지 쓰고, 그 까닭을 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

정답

받는 답:

SELECT COUNT(DISTINCT 블록)
    AS 블록수
FROM (
  SELECT
    SUBSTR(ROWID, 7, 9)
      AS 블록
  FROM 학과
  WHERE 학과코드 = 'CS'
  UNION ALL
  SELECT
    SUBSTR(ROWID, 7, 9)
  FROM 학생
  WHERE 학과코드 = 'CS'
);
블록수
2

2입니다. 클러스터로 묶지 않으면 표마다 따로 저장되어, 학과 표의 CS 행이 든 블록과 학생 표의 CS 학생이 든 블록이 다릅니다. 그래서 두 표를 이어 꺼낼 때 블록을 두 번 읽습니다. 클러스터로 묶으면 같은 질의에 블록을 한 번만 읽습니다.

더 보기: 지역성은 3과목 운영체제 단원에서 페이지 교체와 함께 다시 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로