공공부하자개발 · 영어 학습 노트
SQL
대용량·배치실행 계획·조인·인덱스·파티션·락·대량 처리0/8 완료
  • 01실행 계획 읽기
  • 02조인 방식: Nested Loop, Hash, Sort Merge 와 드라이빙 테이블
  • 03인덱스 튜닝
  • 04통계 정보와 힌트
  • 05파티션: 범위·목록·해시 분할, 파티션 프루닝, 파티션 단위 관리
  • 06대량 INSERT·UPDATE 와 배치 커밋
  • 07락과 데드락
  • 08대용량 삭제·아카이빙
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 대용량·배치 › 05 / 8

파티션: 범위·목록·해시 분할, 파티션 프루닝, 파티션 단위 관리

섹션 6진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6정리‹ 이전다음 ›

4. 응용 변형 예제

예제 5: Oracle · Tibero 파티션 DDL (문법 검토만)

H2 미지원이라 실행하지 않았습니다. 범위 파티션과 INTERVAL 파티션입니다.

sql
-- Oracle · Tibero
CREATE TABLE orders (
  id INT
, branch VARCHAR2(10)
, amt INT
, ord_date DATE
)
PARTITION BY RANGE (ord_date) (
  PARTITION p2025_01 VALUES LESS THAN (DATE '2025-02-01')
, PARTITION p2025_02 VALUES LESS THAN (DATE '2025-03-01')
, PARTITION p2025_03 VALUES LESS THAN (DATE '2025-04-01')
);
sql
-- Oracle 11g 부터: 새 달이 들어오면 파티션이 자동 생성됨
CREATE TABLE orders (
  id INT
, ord_date DATE
)
PARTITION BY RANGE (ord_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) (
  PARTITION p_first VALUES LESS THAN (DATE '2025-02-01')
);

목록과 해시는 아래처럼 씁니다. 표 정의 안의 PARTITION BY 절만 보인 것입니다.

sql
-- Oracle · Tibero
PARTITION BY LIST (branch) (
  PARTITION p_seoul VALUES ('서울')
, PARTITION p_etc VALUES (DEFAULT)
)

PARTITION BY HASH (id) PARTITIONS 4

조각 관리는 ALTER TABLE 로 합니다. 글로벌 인덱스가 있으면 UPDATE GLOBAL INDEXES 를 붙여 인덱스가 UNUSABLE 이 되지 않게 합니다.

sql
-- Oracle · Tibero
ALTER TABLE orders DROP PARTITION p2025_01 UPDATE GLOBAL INDEXES;
ALTER TABLE orders TRUNCATE PARTITION p2025_02 UPDATE GLOBAL INDEXES;
ALTER TABLE orders EXCHANGE PARTITION p2025_03 WITH TABLE orders_stage;

EXCHANGE PARTITION 은 적재용 표와 파티션 하나를 바꿔치기합니다. 데이터를 옮기지 않고 정보만 바꾸므로 적재 표를 미리 채운 뒤 순식간에 붙일 수 있습니다.

예제 6: MySQL 파티션 DDL (문법 검토만)

sql
-- MySQL
CREATE TABLE orders (
  id INT NOT NULL
, branch VARCHAR(10)
, amt INT
, ord_date DATE NOT NULL
, PRIMARY KEY (id, ord_date)
)
PARTITION BY RANGE COLUMNS (ord_date) (
  PARTITION p2025_01 VALUES LESS THAN ('2025-02-01')
, PARTITION p2025_02 VALUES LESS THAN ('2025-03-01')
, PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

PK 가 (id, ord_date) 인 것에 주의합니다. 모든 유니크 키에 파티션 키가 들어가야 하기 때문입니다. 프루닝은 EXPLAIN 의 partitions 열로 확인하고, 조각 관리는 아래처럼 합니다.

sql
-- MySQL
EXPLAIN SELECT COUNT(*) FROM orders WHERE ord_date >= '2025-03-01' AND ord_date < '2025-04-01';
ALTER TABLE orders DROP PARTITION p2025_01;
ALTER TABLE orders TRUNCATE PARTITION p2025_02;

예제 7: MSSQL 파티션 DDL (문법 검토만)

MSSQL 은 파티션 함수, 파티션 구성표, 표의 세 단계입니다.

sql
-- MSSQL
CREATE PARTITION FUNCTION pf_month (DATE)
AS RANGE RIGHT FOR VALUES ('2025-02-01', '2025-03-01', '2025-04-01');

CREATE PARTITION SCHEME ps_month
AS PARTITION pf_month ALL TO ([PRIMARY]);

CREATE TABLE orders (
  id INT NOT NULL
, amt INT
, ord_date DATE NOT NULL
) ON ps_month (ord_date);

RANGE RIGHT 는 경계 값이 오른쪽 파티션에 속합니다. 위 정의에서 2025-02-01 은 두 번째 파티션의 첫 값이 됩니다. RANGE LEFT 는 경계 값이 왼쪽 파티션에 속합니다. 조각 관리는 SWITCH 와 TRUNCATE 입니다.

sql
-- MSSQL
ALTER TABLE orders SWITCH PARTITION 1 TO orders_archive;
TRUNCATE TABLE orders WITH (PARTITIONS (2));

SWITCH 는 조각을 같은 구조의 다른 표로 데이터 이동 없이 옮깁니다. TRUNCATE ... WITH (PARTITIONS) 는 2016 부터 쓸 수 있습니다.

예제 8: 프루닝 확인 도식 (H2 미지원)

3월 조건 쿼리의 계획에서 프루닝은 아래처럼 보입니다. 값은 예시입니다.

sql
-- Oracle · Tibero
SELECT COUNT(*)
  FROM orders
 WHERE ord_date >= DATE '2025-03-01'
   AND ord_date < DATE '2025-04-01';

도식(H2 미지원, 실행 결과 아님)

text
| Id | Operation                | Name   | Pstart | Pstop |
------------------------------------------------------------
|  0 | SELECT STATEMENT         |        |        |       |
|  1 |  SORT AGGREGATE          |        |        |       |
|  2 |   PARTITION RANGE SINGLE |        |      3 |     3 |
|* 3 |    TABLE ACCESS FULL     | ORDERS |      3 |     3 |

Pstart 와 Pstop 이 모두 3 이면 세 번째 파티션(3월) 하나만 읽었다는 뜻입니다. 키에 함수를 씌운 쿼리는 이 값이 1 에서 4 까지 전체 범위로 나올 수 있습니다.

응용 변형 예제
  • 예제 5: Oracle · Tibero 파티션 DDL (문법 검토만)
  • 예제 6: MySQL 파티션 DDL (문법 검토만)
  • 예제 7: MSSQL 파티션 DDL (문법 검토만)
  • 예제 8: 프루닝 확인 도식 (H2 미지원)
이전 섹션3 코드 예제4 / 6다음 섹션5 자주 하는 실수 (Tip)