H2 미지원이라 실행하지 않았습니다. 범위 파티션과 INTERVAL 파티션입니다.
-- 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')
);-- 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 절만 보인 것입니다.
-- 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 이 되지 않게 합니다.
-- 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 은 적재용 표와 파티션 하나를 바꿔치기합니다. 데이터를 옮기지 않고 정보만 바꾸므로 적재 표를 미리 채운 뒤 순식간에 붙일 수 있습니다.
-- 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 열로 확인하고, 조각 관리는 아래처럼 합니다.
-- 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;MSSQL 은 파티션 함수, 파티션 구성표, 표의 세 단계입니다.
-- 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 입니다.
-- MSSQL
ALTER TABLE orders SWITCH PARTITION 1 TO orders_archive;
TRUNCATE TABLE orders WITH (PARTITIONS (2));SWITCH 는 조각을 같은 구조의 다른 표로 데이터 이동 없이 옮깁니다. TRUNCATE ... WITH (PARTITIONS) 는 2016 부터 쓸 수 있습니다.
3월 조건 쿼리의 계획에서 프루닝은 아래처럼 보입니다. 값은 예시입니다.
-- Oracle · Tibero
SELECT COUNT(*)
FROM orders
WHERE ord_date >= DATE '2025-03-01'
AND ord_date < DATE '2025-04-01';도식(H2 미지원, 실행 결과 아님)
| 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 까지 전체 범위로 나올 수 있습니다.