728x90
반응형
0. 이 글을 작성하는 이유
파티션 테이블에 대해 공식 문서에서는 어떻게 설명하고 있는지 이해하면서 읽기 위함. 실제 SQL과 같이 실습하는 것은 다음 글에서 이어서 작성할 예정
https://www.postgresql.org/docs/current/ddl-partitioning.html
https://www.postgresql.org/docs/current/sql-vacuum.html
1. Partitioning이란?
논리적으로 하나의 큰 테이블을 더 작은 물리적 조각들로 나누는 것이다. 라고 하는데 나는 이 문장이 이해가 잘 가지 않아 아래처럼 이해했다.
개발자가 정해놓은 규칙(논리적)에 따라 큰 테이블을 더 작은 데이터로 나누어 저장하는 것(물리적)
Partitioning을 하게 되면 크게 4가지 이점이 존재한다.
- 테이블에서 많이 액세스 되는 row의 대부분이 단일 파티션이나 소수의 파티션에 있는 경우 쿼리 퍼포먼스가 드라마틱하게 향상될 수 있다. Partitioning을 하게 되면 인덱스에 대한 효율도 올라간다. 인덱스는 메모리에 저장되는 공간이 제한되어 있어 하나의 테이블에서 인덱스가 많은 경우 속도가 저하될 수 있다. 하지만 Partitioning을 하는 경우 각각의 Partition에 대한 인덱스도 따로 생성되어 인덱스의 성능이 향상된다.
- 쿼리를 날리거나 업데이트를 할 때 단일 파티션의 상당 부분에 액세스 하는 경우 전체 테이블에 흩어져 랜덤 액세스 읽기가 필요한 인덱스를 사용하는 대신 해당 파티션을 순차적으로 스캔하여 성능을 개선할 수 있다.
- Partitioning 설계에서 사용 패턴을 고려한 경우 파티션을 추가하거나 제거하여 대량 로드 및 삭제를 수행할 수 있다. 테이블을 삭제하거나 테이블 분리 파티션을 변경하여 개별 파티션을 삭제하는 것이 Bulk 작업보다 훨씬 빠르다. 또한 이 경우 Bulk작업의 VACUUM 오버헤드를 방지한다.
- VACUUM이란?
- 마치 VM의 GC처럼 PostgreSQL에서 사용되는 데이터 정리 및 공간 회수 작업이다. VACUUM은 삭제된 row에 대해 디스크에서 제거하고 여유 공간을 만들며 데이터베이스의 성능과 저장 공간 사용량을 최적화한다. 이 작업은 데이터베이스에서 row를 삭제하거나 업데이트하는 작업으로 인해 발생하는데 실제 절차는 이렇게 된다. Operation(Update, Delete) → Row에 이 영역들을 마킹하여 사용하지 않음 처리 → VACUUM작업을 통해 실제 디스크에서 데이터 제거 및 공간 회수
- VACUUM이란?
- 사용 빈도가(액세스가 적은) 데이터는 저렴하고 속도가 느린 스토리지로 이동시킬 수 있다.
- 파티셔닝 테이블은 각각의 파티션 테이블에 대해 스토리지 옵션을 정해줄 수 있는데 액세스가 적은 파티셔닝 테이블에 대해 효율적인 스토리지를 지정해 줄 수 있다.
이 4가지 이점은 테이블이 매우 큰 경우에만 효율적이다. 여기서 테이블이 크다는 기준에 대해 PostgreSQL에서는 본인들의 경험상 데이터베이스 서버의 물리적 메모리를 테이블이 초과한 경우라 말하고 있다.
2. PostgreSQL의 Partitioning 방법 3가지
- Range Partitioning
- 테이블을 범위에 따라 나누는 것으로 각 파티션에 할당된 값의 범위는 서로 겹치지 않는다. 이 범위라는 것은 ‘이상, 미만’ 정책을 따른다. 예를 들어 A라는 파티션 테이블에서 1~10까지 범위가 지정되어 있고 B라는 파티션 테이블에서 10~20 범위가 지정되어 있다면 10이라는 값을 가진 데이터는 B 테이블에 해당된다.
- List Partitioning
- 키 값을 기준으로 파티셔닝을 진행한다. 예를 들어 지역에 따른 파티셔닝을 진행할 때 "서울"이라는 테이블에는 [”강남구”, “동작구”, “관악구”]를 지정해서 할당할 수 있고 "경기"라는 테이블에는 [”남양주”, “화성”, “성남”] 을 할당할 수 있다.
- Hash Partitioning
- Modulus와 Remainder를 지정하여 파티셔닝을 한다. 각 파티션 테이블은 파티션 키의 해시 값이 지정된 Modulus로 나누어서 지정된 나머지가 되는 행들을 보유하게 된다. 예를 들어 파티션마다 모듈러스가 4고 나머지가 0,1,2,3인 경우 파티션 키의 해시 값이 10인 경우 4로 나눈 나머지는 2가 되므로 2인 파티션에 들어가게 된다. 해시 값이 12인 경우 4로 나누면 0이 되므로 0인 파티션에 들어가게 된다. 이 로직을 통해 골고루 분배를 하며 데이터 액세스 성능을 올릴 수 있다.
728x90
반응형
'컴퓨터공학 > 데이터베이스' 카테고리의 다른 글
UUID에 바로 LIKE연산자를 사용하려고 했더니 안되었던 이유는? (1) | 2024.02.04 |
---|---|
postgresql9.6 성능 이야기 1장 - 아키텍처 개요를 보다가 (1) | 2024.01.27 |
postgres가 어느 날 맛이 가버렸다. postmaster는 뭐고 왜 이런 일이 발생했을까 (0) | 2024.01.20 |
PostgreSQL Materialized View 사용기 (1) | 2024.01.12 |
Real MySQL 8.0 읽으면서 정리하기 (1) - 시스템 설정 (0) | 2023.08.23 |