티스토리 뷰

반응형

YSQL supports the following types of partitioning:

  • Range partitioning, when a table is partitioned into ranges defined by one or more key columns. In this case, the ranges of values assigned to partitions do not overlap.
  • List partitioning, when a table is partitioned via listing key values to appear in each partition.
  • Hash partitioning, when a table is partitioned by specifying a modulus and remainder for each partition.

범위, 목록, 해쉬 파티션을 지원 합니다.

이번 글에서는 범위(Range) 파티션을 테스트 해보겠습니다.

 

1.  파티션 테이블 선언


CREATE TABLE tn_order (
order_no varchar(15),
order_dt varchar(8),
user_id varchar(20),
prdt_nm varchar(50),
prdt_price numeric(12),
primary key (order_no, order_dt)
) 
PARTITION BY RANGE (order_dt);

 

 

2.  실제 파티션 테이블 생성


CREATE TABLE tn_order_2022 PARTITION OF tn_order
  FOR VALUES FROM ('20220101') TO ('20230101');
  
CREATE TABLE tn_order_2023 PARTITION OF tn_order
  FOR VALUES FROM ('20230101') TO ('20240101');
  
CREATE TABLE tn_order_2024 PARTITION OF tn_order
  FOR VALUES FROM ('20240101') TO ('20250101');

 

주문일자 기준 연도별로 저장될 수 있도록 생성.

100% 오픈소스 데이터베이스라서 파티션 기능도 정상적으로 사용할 수 있습니다.

 

 

3.  선언된 범위에 해당하지 않는 데이터가 저장될 수 있도록 디폴트 파티션 추가


CREATE TABLE tn_order_default PARTITION OF tn_order DEFAULT;

디폴트 파티션

 

 

4.  인덱스 추가


CREATE INDEX tn_order_01 ON tn_order(user_id);

인덱스가 추가된 모습

 

 

5.  파티션 테이블에서 특정 파티션 제거


ALTER TABLE tn_order DETACH PARTITION tn_order_2024;

제거된 파티션은 별도의 테이블로 보여짐

 

 


 

6.  DML 테스트 - 데이터입력


-- 2021년도 
INSERT INTO tn_order VALUES ('2021010200001','20210102','dev4u','로니카 BCS',159000);

-- 2022년도 
INSERT INTO tn_order VALUES ('2022030200001','20220302','dev4u','Life Chair',59000);

-- 2025년도 (디폴트파티션으로 ...)
INSERT INTO tn_order VALUES ('2025010200001','20250102','dev4u','JMW 헤어드라이', 750000);

데이터 입력

 

 

7.  DML 테스트 - 데이터조회 (Full Table Scan)


SELECT *
FROM TN_ORDER

조회 결과
실행 계획

입력한 데이터가 모두 조회가 되었으며, 해당 SQL에 대한 실행계획도 의도한 데로 TABLE FULL SCAN으로 수립되었습니다.

 

 

8.  DML 테스트 - 데이터조회 (Index Scan)


SELECT *
FROM TN_ORDER
WHERE USER_ID = 'dev4u'

조건절에 user_id를 넣어서 조회해 보니, 인덱스 스캔으로 실행계획이 수립되었습니다.

 

 

9.  DML 테스트 - 특정 파티션 조회 및 실행계획 보기


SELECT *
FROM TN_ORDER
WHERE ORDER_DT BETWEEN '20220101' AND '20220331'

 

주문일자 조건인  '20220101' ~ '20220331' 사이의 데이터가 제대로 출력이 되었습니다.

실행계획을 보니 '2022'년도 파티션과 디폴트 파티션을 Full Table Scan 했습니다.

특이한 점이 디폴트 파티션은 무조건 스캔을 하네요.

 

10.  파티션 제거 후에 데이터 조회해 보기


ALTER TABLE tn_order DETACH PARTITION tn_order_default

주문일자가 '20210102' 과 '20250102' 데이터가 디폴트 파티션에 있어서, 디폴터 파티션 제거 후에 조회가 되지 않았습니다.

그리고 실행계획에서도 디폴트 파티션은 빠졌습니다.

디폴트 파티션도 detach 되면 별도의 테이블로 보이네요.

간단하게 파티션 테이블을 테스트해 보았습니다.

다음번에는 제가 yugabyteDB에 관심을 가지게 된 실시간 백업 지원 여부를 테스트해 보겠습니다.

 

 


 

반응형