일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- union
- 학점은행제무료강의
- 오라클
- DB
- MSA
- it자격증
- 맥북
- 학점은행제
- fastapi
- 은행IT
- 디렉토리계층구조
- 의사결정나무모형
- 프로그래머스
- 코딩테스트
- 맥북환경설정
- 렌탈스튜디오창업
- 계정계
- 맥북셋팅
- Homebrew
- 모놀리식
- Pass By Value
- python
- 컴퓨터공학학사취득
- 코어뱅킹
- oracleapex
- 채널계
- SQL
- jdk17
- 개인프로필스튜디오창업
- jdk
- Today
- Total
개발머해니
[DB] 파티션의 개념, 필요성, 종류 본문
안녕하세요! 오늘은 파티션(Partition)에 대해서 알아보겠습니다.
파티션 테이블이란?
파티션 테이블(Partition Table)이란 사용자가 정의한 기준에 따라 데이터를 분할하여 저장해놓은 테이블입니다. 논리적인 1개의 테이블에 대해서, 여러개의 파티션 테이블을 분할하여 물리적으로 다른 공간에 저장하는 것이죠!
이때, 실제 데이터가 물리적으로 저장되는 곳은 Partition으로 나누어진 Tablespace입니다. 즉, 파티션되지 않은 테이블은 테이블과 저장영역이 1:1 관계지만, 파티션된 테이블일 때는 1:M 관계가 됩니다.
파티션 테이블을 사용하는 이유는?
일반적으로는 오랜 기간 동안 쌓인 데이터를 효율적으로 관리하고 성능저하를 방지하기 위한 용도로 파티션 테이블을 사용합니다. 서로 다른 파티션에 데이터를 저장함으로써 물리적 공간이 분할되어 노드 간의 디스크 경합을 최소화할 수 있다는 장점이 있어 많이 사용합니다!
또한 인덱스를 이용한 Random 액세스 방식은 데이터의 양이 일정 수준을 넘어가는 순간 Full Table Scan보다 오히려 성능이 나빠진다고 합니다. 그렇다고 대용량 데이터 테이블을 Full Scan 하는 것은 매우 비효율적이기 때문에, 테이블을 파티션 단위로 나누어 Full Table Scan이라 하더라도 일부 세그먼트만 읽고 작업을 마칠 수 있게 합니다.
실무 사례 : 최종 로그인 기록 조회 시간 단축
최근 고객의 로그인 실적에 따라 금리 우대를 제공하는 상품이 개발되었습니다. 그래서 고객의 월별 최종로그인 일자를 수신팀에 제공해야 하는 일이 생겼습니다.
하지만 고객의 최종 로그인 정보가 기록되어 있는 테이블의 데이터가 너무 방대했습니다. 로그인 기록 뿐 아니라 기타 하나원큐 고객들의 모든 활동 내역이 저장되어 있었기 때문에, 최종 로그인 기록을 SELECT하는 과정에서 많은 시간이 소요되었습니다.
이를 개선하기 위해 해당 테이블 개요를 살펴보니 테이블 날짜에 따라 분기별로 Range Partition이 생성되어 있는 것을 알 수 있었습니다. 기존 쿼리의 실행계획을 살펴보니 Full Table Scan이 이루어 지고 있었기 때문에 WHERE조건 내에 Range Partition Key로 잡힌 컬럼의 범위 조건을 추가하여 Partition Range로 조회 범위를 줄여 SQL 실행 시간을 단축시켰습니다.
파티션의 종류는?
① RANGE : 범위 기준으로 분할
② LIST : 특정 값들의 집합으로 분할
③ HASH
④ INTERVAL
⑤ REFERENCE
RANGE
- 날짜나 숫자 처럼 범위를 가진 데이터(연속된 값)를 기준으로 하여 만든 파티션 테이블입니다.
- 함께 저장되어야 할 데이터의 범위를 지정하여 테이블을 파티션 합니다.
- Column Value의 범위를 기준으로 하여 행을 분할하는 형태입니다.
SQL> CREATE TABLE range_partition
(
range_key_column date NOT NULL,
data varchar2(20)
)
PARTITION BY RANGE ( range_key_column )
(
PARTITION part_1 VALUES LESS THAN ( to_date('01/01/2022','dd/mm/yyyy')),
PARTITION part_2 VALUES LESS THAN ( to_date('01/01/2023','dd/mm/yyyy'))
)
Table created.
LIST
- 특정값을 가진 데이터로 만든 파티션 테이블입니다.
- 데이터가 균등하게 분포되어 있어 데이터 분포도가 낮지 않을때 유용합니다.
- 이산 값들을 집합으로 묶어 함께 저장될 데이터를 결정하기 때문에 다중 컬럼을 지원하지 않고 단일 컬럼만 가능합니다.
create table list_partition
(
state_cd varchar2(2),
data varchar2(20)
)
partition by list(state_cd)
(
partition part_1 values ( 'ME', 'NH', 'VT', 'MA' ),
partition part_2 values ( 'CT', 'RI' , 'NY' )
) ;
HASH
- 해시 함수에 의해 자동으로 파티셔닝 되는 테이블입니다.
- 해시 파티션은 데이터가 어느 파티션에 지정될지 알 수 없기 때문에 관리의 목적보다는, 데이터를 분산시켜 디스크 성능을 개선하는데 목적을 두고 있습니다.
INTERVAL
- Range 파티션과 유사하며 파티션이 추가되는 기준(규칙)을 지정할 때 사용합니다.
- 기존 파티션에 데이터가 있고 새로운 데이터가 입력될 때에만 새로운 파티션을 생성합니다.
- Range 파티션에서 MAXVALUE 파티션 지정 없이 생성한 경우, 후에 데이터가 추가됐을 때 지정한 INTERVAL 만큼의 범위를 가지는 파티션이 생성됩니다.
REFERENCE
- 자식 테이블 파티션이 부모 테이블 파티션과 일대일 관계인 환경에서 자식 테이블을 파티션할 때 사용합니다.
- 자식 테이블의 파티셔닝을 부모 테이블로부터 상속받습니다.
- 파티셔닝 키는 자식 테이블의 실제 컬럼에 저장되지 않습니다.
여기까지 파티션 테이블에 대해서 알아보았습니다!
'백엔드' 카테고리의 다른 글
[DB] 오라클에 이모지(Emoji)를 저장할 수 있을까? (0) | 2023.08.31 |
---|---|
[스프링] 클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까? (0) | 2023.08.30 |
[스프링] 예외처리 종류과 효과적인 사용 방법 (0) | 2023.08.29 |
[DB] 인덱스는 어떤 기준으로 잡는 게 좋을까? (0) | 2023.08.27 |
[DB] DML을 하면 무조건 인덱스의 성능저하를 가져올까? (0) | 2023.08.26 |