고급 데이터베이스
목차 16
큰 테이블 하나를 효율적으로 다루는 세 가지 고급 도구 — VIEW(추상화)·INDEX(검색 가속)·파티셔닝(병행성 분산)을 함께 정리한다. 3과목에서 매년 0~1문항 출제되는 방어 단원이지만, 나오는 함정이 거의 굳어 있어 한 번 걸러내는 눈만 만들면 가져가는 점수다.
핵심 암기: VIEW 4대 특성 가물독기(가상·물리 저장❌·독자 인덱스❌·기본 테이블 의존) · INDEX 트레이드오프(SELECT↑ / 변경 3종↓ / 저장 공간↑) · 자료구조 B+Tree(범위✅)·해시(등호만)·비트맵(낮은 카디) · 파티셔닝 4종 범해리복(범위·해시·리스트·복합) · 수평=행 / 수직=열 · 3분별 한·여·복(파티 한 DB·병행 / 샤딩 여러 DB·확장 / 클러스터링 복제·가용)
VIEW (가상 테이블)
VIEW 정의와 가물독기 4대 특성 ·VIEW·1순위·
[정의] VIEW(뷰) = 하나 이상의 기본 테이블에 정의된 SELECT 문에 이름을 붙인 가상의 테이블. 데이터를 따로 저장하지 않고, 조회할 때마다 그 SELECT를 다시 실행해 결과를 보여준다.
[표] ★가물독기★ — 4대 특성.
| 글자 | 특성 | 핵심 |
|---|---|---|
| 가 | 가상 테이블 | 실체는 SELECT 정의문뿐 |
| 물 | 물리 저장 ❌ | 정의문만 데이터 사전에 보관·매번 SELECT 재실행 |
| 독 | 독자 인덱스 ❌ | 자기 인덱스 없음·기본 테이블 인덱스를 빌려 사용 |
| 기 | 기본 테이블 의존 | 기본 테이블이 삭제되면 뷰도 함께 사라짐 |
CREATE VIEW active_students AS
SELECT student_id, name, dept_id
FROM student
WHERE status = 'ACTIVE';
- 뷰 정의는 결국 27강에서 본 SELECT 문 그 자체다(프위그해셀오에 이름을 붙인 것). 그래서 뷰가 할 수 있는 일은 SELECT가 할 수 있는 범위 안에 갇힌다.
🔑 암기 가·물·독·기 — 가상·물리❌·독자 인덱스❌·기본 의존. ⚠️ 함정 "VIEW에 CREATE INDEX 가능" ❌(→ 독자 인덱스 없음·'독') / "VIEW가 디스크에 데이터를 따로 저장" ❌(→ 정의문만 보관·'물'). 🎯 빈출 VIEW 설명 중 틀린 것 고르기. 거의 매회 '독자 인덱스 생성 가능'이 오답으로 끼어든다. 💡 보충 실무에선 민감 컬럼(계좌·결제)을 뺀 뷰만 특정 계정에 권한으로 주는 보안 마스킹에 자주 쓴다.
VIEW 갱신 가능성 — 단순 SELECT만 ·VIEW·
[정의] 뷰에 INSERT·UPDATE·DELETE를 할 수 있는지는 조건이 까다롭다. 판정 원리는 한 줄 — 뷰의 한 행이 기본 테이블의 한 행과 1:1로 대응될 때만 갱신 가능하다.
[표] 갱신 가능 여부.
| 뷰 정의 형태 | 갱신 | 이유 |
|---|---|---|
| 단순 SELECT(한 테이블·WHERE만) | ✅ | 기본 테이블 행과 1:1 대응 |
| JOIN 뷰(2개 이상 결합) | ❌ | 어느 기본 테이블에 반영할지 모호 |
| 집계 함수(SUM·COUNT·AVG) | ❌ | 원본 행과 1:1 대응 안 됨 |
| GROUP BY · DISTINCT · UNION | ❌ | 원본 행과 1:1 대응 안 됨 |
COUNT(*)로 묶인 한 행에 INSERT를 시키면 DBMS는 그 값을 원본 어느 행으로 풀어야 할지 알 수 없다. 그래서 집계·그룹 뷰는 갱신이 막힌다.
🔑 암기 단순 SELECT 한 테이블만 ✅ / JOIN·집계·GROUP BY 끼면 전부 ❌. ⚠️ 함정 "GROUP BY 뷰에 INSERT 가능" ❌ / "집계 뷰에 UPDATE 가능" ❌ — 보기에 JOIN·집계·GROUP BY가 보이면 무조건 갱신 불가. 🎯 빈출 갱신 가능한 뷰/불가능한 뷰 고르기. 1:1 대응 한 줄이면 즉답.
VIEW 활용 3종과 DROP CASCADE / RESTRICT ·VIEW·
[표] 뷰를 쓰는 이유 3가지 — 한마디로 추상화 계층.
| # | 활용 | 한 줄 |
|---|---|---|
| ① | 복잡한 SELECT 단순화 | 여러 테이블 JOIN을 뷰 이름 하나로 즉시 조회 |
| ② | 보안 컬럼 마스킹 | 민감 컬럼 뺀 뷰에만 권한 부여 |
| ③ | 논리적 데이터 독립성 | 기본 테이블 구조가 바뀌어도 뷰가 인터페이스를 유지 |
[표] DROP VIEW 옵션 (26강 DROP CASCADE/RESTRICT 회수).
| 옵션 | 동작 |
|---|---|
| RESTRICT | 의존하는 객체가 하나라도 있으면 삭제 거부 (기본값·안전) |
| CASCADE | 이 뷰에 의존하는 다른 뷰·제약까지 연쇄 삭제 |
CREATE VIEW v2 AS SELECT * FROM v1 WHERE dept_id = 'D01';
DROP VIEW v1 RESTRICT; -- v2가 v1에 의존 → 거부
DROP VIEW v1 CASCADE; -- v1, v2 연쇄 삭제
- 26강에서 본 대로 DROP의 CASCADE/RESTRICT 구문은 TABLE이든 VIEW든 동일하고, 디폴트는 보수적인 RESTRICT다.
🔑 암기 RESTRICT = 의존 있으면 거부(디폴트) / CASCADE = 연쇄 삭제. ⚠️ 함정 "DROP VIEW 디폴트는 CASCADE" ❌(→ RESTRICT). 가물독기의 '기' — 기본 테이블이 DROP되면 뷰도 함께 사라진다. 🎯 빈출 뷰 활용 목적 고르기, DROP 옵션 동작 매칭. 보통.
INDEX (인덱스)
INDEX 정의와 트레이드오프 ·INDEX·1순위·
[정의] INDEX(인덱스) = 검색 속도를 높이려고 컬럼 기준으로 정렬된 키 + 행 위치 포인터를 디스크에 따로 저장한 자료구조. VIEW가 추상화 계층이라면 인덱스는 검색 가속 계층이다.
[표] ★트레이드오프 — 시험 1순위★.
| 영향 | 방향 | 이유 |
|---|---|---|
| SELECT(검색) | ↑ 빨라짐 | O(log n)·인덱스의 본질 목적 |
| INSERT | ↓ 느려짐 | 테이블 행 + 모든 인덱스에 키 추가 |
| UPDATE(인덱스 컬럼) | ↓ 느려짐 | 인덱스 키 재정렬 비용 |
| DELETE | ↓ 느려짐 | 테이블 행 + 인덱스 키 삭제 |
| 저장 공간 | ↑ 증가 | 테이블의 10~30% 추가 |
CREATE INDEX idx_student_name ON student(name);
CREATE UNIQUE INDEX idx_email ON member(email);
DROP INDEX idx_student_name;
- PK 제약·UNIQUE 제약에는 인덱스가 자동으로 생성된다.
- INSERT 한 번에 (1)테이블 행 추가 + (2)관련 인덱스 전부 갱신이 29강의 트랜잭션(원일고영)으로 한꺼번에 처리된다. 인덱스가 많을수록 변경 트랜잭션이 길어지고 락 보유 시간도 늘어난다.
🔑 암기 SELECT↑ / 변경 3종(INSERT·UPDATE·DELETE)↓ / 저장 공간↑. 인덱스는 공짜가 아닌 거래. ⚠️ 함정 "인덱스가 많을수록 모든 SQL이 빨라짐" ❌(→ 변경은 느려짐) / "인덱스는 디스크를 절약한다" ❌(→ 추가 공간 필요). 🎯 빈출 인덱스 설명 중 옳은/틀린 것 고르기. '변경이 빨라진다'는 보기는 무조건 함정.
INDEX 자료구조 4종 ·INDEX·
[표] 같은 인덱스라도 내부 자료구조에 따라 잘하는 일이 다르다.
| 자료구조 | 검색 | 범위 검색 | 특징 |
|---|---|---|---|
| B+Tree | O(log n) | ✅ 가능 | DBMS 표준·리프 노드를 연결 리스트로 묶어 범위 스캔 |
| B-Tree | O(log n) | △ 일부 | 균형 다중 트리·리프 연결 ❌ |
| 해시 | O(1) | ❌ 불가 | 등호 검색만·해시 함수 기반(순서 보존 ❌) |
| 비트맵 | 비트 연산 | △ AND/OR | 낮은 카디널리티·주로 DW(데이터 웨어하우스) |
[50] ← 루트
/ \
[20,35] [70,85] ← 내부 노드
/ | \ / | \
[ ][ ][ ] [ ][ ][ ] ← 리프(연결 리스트로 양옆 연결)
───────────────────▶ 범위 검색: 시작 리프만 찾으면 옆으로 쭉
- B+Tree가 표준인 이유 — 리프끼리 옆으로 연결돼
WHERE age BETWEEN 20 AND 35같은 범위 검색이 빠르고, 트리 높이가 항상 균형이라 O(log n)이 보장된다.
🔑 암기 B+Tree=표준·범위✅ / 해시=등호만(O(1)) / 비트맵=낮은 카디·DW. ⚠️ 함정 "B-Tree = Binary Tree" ❌(→ Balanced Tree) / "해시 인덱스로 범위 검색 빠름" ❌(→ 순서 보존 안 해 등호만) / "비트맵 = OLTP 표준" ❌(→ DW·OLAP). 🎯 빈출 범위 검색에 적합한 자료구조(→ B+Tree), B-Tree 약어 의미(→ Balanced). 매회 1순위 함정.
클러스터형 vs 비클러스터형 인덱스 ·INDEX·
[표] 개수 함정이 짝으로 출제된다.
| 구분 | 클러스터형(Clustered) | 비클러스터형(Non-Clustered) |
|---|---|---|
| 개수 | 테이블당 1개만 | 여러 개 가능(N개) |
| 자동 생성 | PK 제약에 자동 | UNIQUE 제약에 자동 |
| 저장 | 테이블 데이터가 인덱스 순서로 물리 정렬 | 인덱스가 본체와 별도(포인터로 연결) |
| 검색 | 빠름(정렬된 본체 = 인덱스) | 한 번 더 점프(인덱스→본체) |
- 클러스터형이 1개뿐인 이유 — 테이블 데이터를 그 순서로 물리 정렬하는 것이라, 한 테이블을 두 가지 순서로 동시에 줄 세울 수 없다.
- 용어 함정 1순위 — '클러스터형 인덱스'(인덱스 종류·PK·1개·물리 정렬)와 'DB 클러스터링'(서버 복제·가용성)은 완전히 다른 개념이다. 같은 '클러스터'라는 단어 때문에 가장 자주 헷갈린다.
🔑 암기 PK 자동=클러스터형=1개(물리 정렬) / UNIQUE 자동=비클러스터형=N개(별도). ⚠️ 함정 "클러스터형 인덱스는 한 테이블에 여러 개" ❌(→ 1개) / "비클러스터형은 1개만" ❌(→ N개) / "클러스터형 인덱스 = DB 클러스터링" ❌(→ 다른 개념). 🎯 빈출 개수(1개 vs N개), PK/UNIQUE 매칭. 짝으로 출제.
카디널리티와 INDEX 선정 기준 ·INDEX·
[정의] 카디널리티(Cardinality) = 한 컬럼의 고유 값 개수. student_id(전부 다름)는 높고, gender(M/F 둘뿐)는 낮다.
[표] 카디널리티와 인덱스 적합성.
| 카디널리티 | 예시 | B+Tree 인덱스 |
|---|---|---|
| 매우 높음 | student_id·email | ✅ 최적 |
| 중간 | dept_id·카테고리 | △ 선택적 |
| 낮음 | gender·status | ❌ 비효율(비트맵·DW) |
- 카디가 낮은 컬럼은 인덱스를 타도 테이블 절반 이상을 훑게 돼 오히려 느리다. 성별에 인덱스를 걸어도 'M' 검색이 전체 절반을 잡으니 옵티마이저가 풀 스캔으로 우회한다.
[표] 인덱스 선정 — 걸어야 할 곳 vs 말아야 할 곳.
| 인덱스 ✅ | 인덱스 ❌ |
|---|---|
| WHERE·JOIN 키에 자주 등장 | 카디 낮은 컬럼(성별·상태) |
| ORDER BY·GROUP BY 컬럼 | 자주 변경되는 컬럼 |
| 카디 높은 컬럼 | 행이 수십 개뿐인 작은 테이블(풀 스캔이 빠름) |
🔑 암기 카디 높고 자주 검색되는 컬럼에만. ⚠️ 함정 "성별에 B+Tree 만들면 효율적" ❌(→ 카디 낮아 비효율) / "인덱스는 많을수록 좋다" ❌(→ 변경 비용만 증가). 🎯 빈출 인덱스 적합 컬럼 고르기. 보통.
파티셔닝과 분산 데이터베이스
수평 분할 vs 수직 분할 ·파티셔닝·1순위·
[정의] 파티셔닝(Partitioning) = 하나의 큰 테이블을 한 DB 안에서 여러 조각(파티션)으로 나눠 저장·관리하는 기법. 응용 프로그램에는 여전히 하나의 테이블로 보이지만, DBMS 내부에서는 여러 파티션에 분산된다.
[표] 분할 방향 — 시험 1순위 함정.
| 구분 | 수평 분할(Horizontal) | 수직 분할(Vertical) |
|---|---|---|
| 기준 | 행(Row) 단위 | 열(Column) 단위 |
| 예시 | 사용자를 지역·날짜별로 분산 | 자주 보는 열과 드문 열을 분리 |
| 파티셔닝 4종 | 여기에 속함(수평 안의 4가지) | 해당 없음 |
[ 수평 분할 — 행(Row) 단위 ]
파티션 1 ← 지역 = 서울 (100행)
파티션 2 ← 지역 = 부산 (80행)
파티션 3 ← 지역 = 대구 (50행)
→ 케이크를 가로로 슬라이스 (행 묶음을 나눔)
[ 수직 분할 — 열(Column) 단위 ]
열 그룹 A ← id · 이름 (자주 조회)
열 그룹 B ← 결제정보 · 주소 (드물게/민감)
→ 케이크를 세로로 자름 (열 묶음을 나눔)
🔑 암기 수평=행(가로 슬라이스) / 수직=열(세로 자르기). 'horizontal=지평선=옆으로 누운 행'으로 연결. ⚠️ 함정 "수평 분할 = 열 단위" ❌(→ 행 단위). 방향을 정반대로 뒤집은 보기가 1순위. 🎯 빈출 수평/수직 방향 매칭. 파티셔닝 4종이 수평 안에 속한다는 것까지.
범해리복 — 파티셔닝 4종 ·파티셔닝·핵심 두문자·
[정의] 파티셔닝(수평 분할) 4종을 범해리복 네 글자로 묶는다. 네 종류 모두 수평 분할(행 단위) 안의 분류다.
[표] ★범해리복★.
| 글자 | 종류 | 분할 기준 | 예시 |
|---|---|---|---|
| 범 | 범위(Range) | 값의 범위·구간 | 월별 파티션·ID 1000 단위 |
| 해 | 해시(Hash) | 해시 함수로 균등 분산 | 사용자 ID 해시 → 16 버킷 |
| 리 | 리스트(List) | 명시한 값 목록·이산 값 | 지역(서울·부산)·등급 코드 |
| 복 | 복합(Composite) | 두 가지 방식 조합 | Range+Hash·Range+List |
CREATE TABLE orders (order_id BIGINT, order_date DATE)
PARTITION BY RANGE (order_date) (
PARTITION p_2026_01 VALUES LESS THAN ('2026-02-01'),
PARTITION p_2026_02 VALUES LESS THAN ('2026-03-01')
);
ALTER TABLE orders DROP PARTITION p_2025_01; -- 오래된 파티션 일괄 제거
- 마지막 줄처럼 오래된 데이터를 행 하나씩 DELETE하지 않고 파티션째 떼어내는 것이 파티셔닝의 관리 편의성이다.
🔑 암기 범(구간)·해(해시·균등·등호만)·리(명시 값·이산)·복(두 방식 조합). '범죄자가 해리를 복수한다.' ⚠️ 함정 "해시 파티셔닝으로 범위 검색이 빠르다" ❌(→ 등호만) / "리스트 파티셔닝은 연속 값을 나눈다" ❌(→ 이산 값) / 보기에 트리·정규화처럼 네 글자 밖 단어가 끼면 그게 정답(파티셔닝 아님). 🎯 빈출 파티셔닝 종류가 아닌 것 고르기. 보기 순서만 매년 뒤바뀐다.
파티셔닝의 효과 — 병행성 강화 ·파티셔닝·
[표] 파티셔닝을 걸면 좋아지는 4가지. 용량만 나누는 게 아니라는 점이 포인트다.
| # | 효과 | 한 줄 |
|---|---|---|
| ① | 검색 성능 | 파티션 프루닝 — WHERE 절로 불필요한 파티션은 건너뜀 |
| ② | 관리 편의 | DROP PARTITION으로 오래된 데이터 일괄 제거 |
| ③ | 병행성 강화 | 락 경합이 파티션별로 분산 → 동시 처리량 증가 |
| ④ | 부분 가용성 | 한 파티션에 장애가 나도 다른 파티션은 정상 |
[ 파티셔닝 ❌ — 단일 테이블 ]
T1 ─ X락(orders) 보유
T2 ─ 대기 다른 행이라도 한 테이블 락에 묶여 대기
[ 파티셔닝 ✅ — 적용 후 ]
T1 ─ X락(orders.p_01) ─ 진행
T2 ─ X락(orders.p_02) ─ 진행 다른 파티션이라 동시에 독립 진행
- 29강에서 본 격리성(ACID의 'I')은 병행 제어로 구현되고, 로킹 단위가 작을수록 병행성이 올라갔다. 파티셔닝은 테이블 전체가 아니라 파티션 단위로 락이 잡혀 로킹 단위를 자연스럽게 줄이는 효과를 낸다 — 그래서 병행성·격리성이 강화된다.
🔑 암기 파티셔닝 효과 = 검색·관리·병행성·가용성 / 핵심은 병행성 강화(락 경합 분산). ⚠️ 함정 "파티셔닝은 검색 속도만 향상시킨다" ❌(→ 병행성·동시 처리도 강화). 효과 보기에 병행성·동시성 강화가 보이면 ✅. 🎯 빈출 파티셔닝 효과 고르기. 병행성 강화가 정답 키워드.
3분별 — 파티셔닝 vs 샤딩 vs 클러스터링 ·분산 DB·
[표] 이름이 비슷한 세 기법을 범위·목적으로 가른다.
| 구분 | 파티셔닝 | 샤딩 | 클러스터링 |
|---|---|---|---|
| 범위 | 한 DB 안 | 여러 DB 사이 | 여러 서버(같은 DB 복제) |
| 분할 | 수평(범해리복) | 수평(샤드 키) | 분할 없음(복제) |
| 목적 | 병행성 | 확장성(Scale-out) | 가용성(HA·Failover) |
- 샤딩 — 데이터를 샤드 키 기준으로 여러 DB에 나눠 저장. 단일 DB의 한계를 넘기 위함 → 확장성.
- 클러스터링 — 여러 서버에 같은 DB를 복제. 한 서버가 죽어도 자동 대체(Failover) → 가용성.
파티셔닝 — 한 단지 안에서 동·호수 그룹으로 나눔 (관리사무소 = DB 하나)
샤딩 — 서로 다른 동네에 다른 단지 (관리사무소 = DB 여러 개)
클러스터링 — 같은 단지를 여러 곳에 통째로 복제 (한 곳 무너져도 백업 생존)
🔑 암기 한·여·복 — 파티(한 DB·병행) / 샤딩(여러 DB·확장) / 클러스터링(복제·가용). ⚠️ 함정 "파티셔닝 = 샤딩" ❌(→ 한 DB vs 여러 DB) / "클러스터링 = 분할" ❌(→ 복제) / "클러스터형 인덱스 = 클러스터링" ❌(→ 완전히 다른 개념). 🎯 빈출 목적(가용성/확장성/병행성)으로 기법 찾기. 한·여·복 세 글자면 즉답. 💡 보충 대규모 서비스는 셋을 함께 쓴다 — 샤드 키로 여러 DB에 나누고(샤딩), 각 DB를 복제해 가용성을 챙기고(클러스터링), 각 DB 안에서 다시 범위 파티셔닝을 건다. 경쟁이 아니라 보완 관계다.
기출 다지기
[기출 1 출제] 다음 중 VIEW에 대한 설명으로 옳지 않은 것은? (VIEW 특성)
- ① 하나 이상의 기본 테이블에서 유도되는 가상의 테이블이다.
- ② VIEW에는 독자적인 인덱스를 생성할 수 있다.
- ③ 정의된 기본 테이블이 삭제되면 VIEW도 자동으로 삭제된다.
- ④ VIEW의 정의는 ALTER로 변경할 수 없고, DROP 후 다시 CREATE해야 한다.
정답 및 해설 보기
정답 ②
VIEW는 자기만의 인덱스를 갖지 못한다(가물독기의 '독'). 기본 테이블의 인덱스를 빌려 쓸 뿐이다.
| 보기 | 판정 | 가물독기 |
|---|---|---|
| ① 가상 테이블 | ✅ | '가' |
| ② 독자 인덱스 생성 가능 | ❌ | '독' 함정 → 정답(틀림) |
| ③ 기본 테이블 삭제 시 자동 삭제 | ✅ | '기' |
| ④ ALTER 불가·DROP 후 재생성 | ✅ | 정의 변경은 재생성 |
🔑 암기 가·물·독·기 — 가상·물리❌·독자 인덱스❌·기본 의존.
[기출 2 출제] 다음 중 갱신(INSERT·UPDATE·DELETE)이 가능한 뷰는? (VIEW 갱신)
- ① 두 테이블을 JOIN해 만든 뷰
- ② COUNT(*) 집계를 포함한 뷰
- ③ 한 테이블에 WHERE 조건만 건 단순 SELECT 뷰
- ④ GROUP BY로 그룹화한 뷰
정답 및 해설 보기
정답 ③
뷰의 한 행이 기본 테이블의 한 행과 1:1로 대응될 때만 갱신할 수 있다. 단순 SELECT(한 테이블·WHERE만)가 여기에 해당한다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① JOIN 뷰 | ❌ | 어느 기본 테이블에 반영할지 모호 |
| ② 집계 뷰 | ❌ | 원본 행과 1:1 대응 안 됨 |
| ③ 단순 SELECT | ✅ | 1:1 대응 → 정답 |
| ④ GROUP BY 뷰 | ❌ | 원본 행과 1:1 대응 안 됨 |
🔑 암기 단순 SELECT 한 테이블만 ✅ / JOIN·집계·GROUP BY 끼면 전부 ❌.
[기출 3 출제] 다음 중 INDEX에 대한 설명으로 옳은 것은? (INDEX 트레이드오프)
- ① INDEX를 많이 생성할수록 INSERT·UPDATE 성능이 향상된다.
- ② B+Tree 인덱스는 등호 검색만 가능하고 범위 검색은 불가능하다.
- ③ 카디널리티가 낮은 컬럼에 B+Tree 인덱스를 만들면 가장 효율적이다.
- ④ PK 제약을 지정하면 해당 컬럼에 인덱스가 자동으로 생성된다.
정답 및 해설 보기
정답 ④
PK 제약을 걸면 인덱스가 자동 생성된다(클러스터형). 나머지는 트레이드오프·자료구조·카디널리티 함정이다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 변경 빨라짐 | ❌ | 변경(INSERT·UPDATE·DELETE)은 오히려 느려짐 |
| ② B+Tree 등호만 | ❌ | B+Tree는 범위 ✅ / 등호만은 해시 |
| ③ 낮은 카디 효율 | ❌ | 비효율 → 비트맵(DW) 영역 |
| ④ PK 자동 인덱스 | ✅ | PK→클러스터형 1개 → 정답 |
🔑 암기 SELECT↑ / 변경 3종↓ / PK 자동 클러스터형 1개·UNIQUE 자동 비클러스터형 N개.
[기출 4 출제] WHERE age BETWEEN 20 AND 35 같은 범위 검색에 가장 적합한 인덱스 자료구조는? (자료구조)
- ① 해시 인덱스
- ② B+Tree 인덱스
- ③ 비트맵 인덱스
- ④ 역인덱스
정답 및 해설 보기
정답 ②
B+Tree는 리프 노드끼리 연결 리스트로 묶여 있어, 시작 키만 찾으면 리프를 따라가며 범위를 쭉 긁어온다.
| 자료구조 | 등호 | 범위 | 적용 |
|---|---|---|---|
| B+Tree | ✅ | ✅ | DBMS 표준 → 정답 |
| 해시 | ✅ | ❌ | 등호 전용(O(1)) |
| 비트맵 | ✅ | △ | 낮은 카디·DW |
| 역인덱스 | — | — | 검색엔진 전용(범위 ❌) |
🔑 암기 B+Tree=표준·범위✅ / 해시=등호만 / 비트맵=낮은 카디(DW). 해시 범위 검색은 절대 ❌.
[기출 5 출제] 클러스터형 인덱스와 비클러스터형 인덱스에 대한 설명으로 옳지 않은 것은? (클러스터형 인덱스)
- ① 클러스터형 인덱스는 테이블당 1개만 생성된다.
- ② 클러스터형은 PK 제약, 비클러스터형은 UNIQUE 제약에 자동 생성된다.
- ③ 클러스터형 인덱스는 테이블 데이터를 인덱스 순서로 물리 정렬한다.
- ④ 비클러스터형 인덱스는 테이블당 1개만 생성된다.
정답 및 해설 보기
정답 ④
비클러스터형 인덱스는 여러 개(N개) 생성할 수 있다. 1개만 생성되는 것은 클러스터형이다.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 클러스터형 1개 | ✅ | 물리 정렬은 한 순서만 가능 |
| ② PK→클러스터형·UNIQUE→비클러스터형 | ✅ | 자동 생성 규칙 |
| ③ 인덱스 순서로 물리 정렬 | ✅ | 클러스터형의 정의 |
| ④ 비클러스터형 1개만 | ❌ | N개 가능 → 정답(틀림) |
🔑 암기 PK 자동=클러스터형=1개 / UNIQUE 자동=비클러스터형=N개.
[기출 6 출제] 다음 중 파티셔닝에 대한 설명으로 옳지 않은 것은? (파티셔닝)
- ① 하나의 큰 테이블을 한 DB 안에서 여러 파티션으로 나눈다.
- ② 수평 분할은 열(Column) 단위로 데이터를 나누는 방식이다.
- ③ 종류로는 범위·해시·리스트·복합이 있다.
- ④ DROP PARTITION으로 오래된 데이터를 일괄 제거할 수 있다.
정답 및 해설 보기
정답 ②
수평 분할은 행(Row) 단위다. 열(Column) 단위는 수직 분할이다. 방향을 뒤집은 1순위 함정.
| 보기 | 판정 | 이유 |
|---|---|---|
| ① 한 DB 안 분할 | ✅ | 파티셔닝의 정의 |
| ② 수평=열 단위 | ❌ | 수평은 행 단위 → 정답(틀림) |
| ③ 범해리복 4종 | ✅ | 범위·해시·리스트·복합 |
| ④ DROP PARTITION 일괄 제거 | ✅ | 관리 편의성 |
🔑 암기 수평=행 / 수직=열 · 4종=범해리복.
[기출 7 출제] 분산 데이터베이스 환경에서 가용성(HA) 확보를 주 목적으로 하는 기법은? (분산 DB 분별)
- ① 파티셔닝
- ② 샤딩
- ③ 클러스터링
- ④ 정규화
정답 및 해설 보기
정답 ③
클러스터링 = 같은 DB를 여러 서버에 복제 = 가용성(HA·Failover).
| 보기 | 목적 | 가용성 |
|---|---|---|
| ① 파티셔닝 | 병행성(한 DB) | ❌ |
| ② 샤딩 | 확장성(여러 DB) | ❌ |
| ③ 클러스터링 | 가용성(복제·HA) | ✅ 정답 |
| ④ 정규화 | 무결성 | ❌ |
🔑 암기 한·여·복 — 파티(한 DB·병행)·샤딩(여러 DB·확장)·클러스터링(복제·가용).
한 장 요약
VIEW — 가물독기
| 가 | 물 | 독 | 기 |
|---|---|---|---|
| 가상 테이블 | 물리 저장 ❌ | 독자 인덱스 ❌ | 기본 테이블 의존 |
- 갱신 = 단순 SELECT 한 테이블만 ✅ / JOIN·집계·GROUP BY ❌
- DROP VIEW = RESTRICT(의존 있으면 거부·디폴트) / CASCADE(연쇄 삭제)
INDEX
- 트레이드오프 — SELECT↑ / 변경 3종(INSERT·UPDATE·DELETE)↓ / 저장 공간↑
- 자료구조 — B+Tree(범위✅·표준) / B-Tree(=Balanced·리프 연결❌) / 해시(등호만·O(1)) / 비트맵(낮은 카디·DW)
- 클러스터형(PK 자동·1개·물리 정렬) vs 비클러스터형(UNIQUE 자동·N개·별도)
- 카디 낮은 컬럼(성별·상태)에는 인덱스 ❌
파티셔닝 — 범해리복 (수평 분할 4종)
| 범 | 해 | 리 | 복 |
|---|---|---|---|
| 범위(Range) | 해시(Hash) | 리스트(List) | 복합(Composite) |
| 구간 | 균등·등호만 | 명시 값·이산 | 두 방식 조합 |
- 수평=행(Row) / 수직=열(Column) · 효과 = 검색·관리·병행성 강화·부분 가용성
3분별 — 한·여·복
| 기법 | 범위 | 분할 | 목적 |
|---|---|---|---|
| 파티셔닝 | 한 DB 안 | 수평(범해리복) | 병행성 |
| 샤딩 | 여러 DB | 수평(샤드 키) | 확장성 |
| 클러스터링 | 여러 서버 | 복제(분할 없음) | 가용성 |
핵심 함정 5쌍
- VIEW에 CREATE INDEX ❌ (독자 인덱스 없음) · 인덱스 많아도 변경은 느려짐
- 해시 인덱스 범위 검색 ❌ (등호만) · 클러스터형 인덱스는 1개만 (N개 ❌)
- 수평=행 (열 ❌) · 파티셔닝 ≠ 샤딩 (한 DB vs 여러 DB) · 클러스터형 인덱스 ≠ DB 클러스터링
