오늘의 주제는 “파티션 테이블” 입니다.
하나의 테이블에서 반복적인 삭제 작업을 하게 된다면 해당 테이블에
SELECT하거나 INSERT 할 때 성능 저하가 발생한다는 내용을 다뤄보려고 합니다.
아래의 그림은 테이블에 존재하던 데이터를 삭제한 후의 모습입니다.

테이블의 데이터를 삭제하게 되면 더 이상 해당 데이터가 존재하지 않기 때문에 대부분의 사용자는 삭제 작업 과정에서 데이터가 완전히 지워지고 해당 공간마저도 반납된다고 생각하게 되지만,
실제 DBMS 내부에서는 데이터를 삭제하더라도 삭제된 데이터가 사용하던 공간은 반납하지 않습니다.
그렇기 때문에 반복적인 삭제 작업을 수행한 테이블을 조회하면 아래의 그림처럼 DBMS는 HWM 위치까지 스캔하고 결과집합을 리턴합니다.

이러한 반복적인 삭제 작업이 발생하는 테이블에서 성능 저하를 줄이기 위해서
이번에는 파티션에 대한 내용을 다뤄보겠습니다.
파티션에는 세 종류(List Partition, Range Partition, Hash Partition)가 존재합니다.
각각의 파티션별 장단점이 존재하지만
오늘은 Range Partition 에 대한 내용을 다뤄보려 합니다.
MySQL에서는 각각의 파티션에 로컬 인덱스가 생성되기 때문에
파티션의 키는 무조건 PK 혹은 UK로 설정되어 있어야 합니다.
# MySQL
create table emp_log (
emp_no int not null auto_increment,
hire_date datetime not null default now(),
emp_name varchar(30) not null,
primary key (emp_no, hire_date),
key (hire_date)
) partition by range (columns(hire_date)) (
PARTITION p_202212 VALUES LESS THAN ('2023-01') ENGINE = InnoDB,
PARTITION p_202301 VALUES LESS THAN ('2023-02') ENGINE = InnoDB,
PARTITION p_202302 VALUES LESS THAN ('2023-03') ENGINE = InnoDB
);
읽기
쓰기
파티션 테이블을 생성하더라도 조회 과정에서 파티션 테이블의 키를 명시하지 않으면 결국 모든 파티션 테이블을 조회하며 FULL SCAN 작업이 진행되므로 주의해야 합니다.
특히, MySQL을 사용하는 사용자라면 더욱더 주의가 필요합니다.
MySQL 환경에서 Range Partition을 사용한다면 오라클과 같이 MAXVALUE 기능이 존재하지 않기 때문에 주기적인 관리가 중요합니다.
파티션 테이블을 사용하게 되면 그만큼 관리 포인트가 늘어나기 때문에 관리자의 입장에서는 장애 발생 가능성을 지닌 채 운영해야 합니다.
그렇기 때문에 파티션 테이블은 적절한 상황에서 적절한 테이블에 도입하여 관리하는 것이 중요합니다.