[SQLP]리스트 파티셔닝(List Partitioning),Range Partition,Hash Partition

·2025년 2월 6일

SQLP

목록 보기
18/20

😺List Partitioning

특정 열의 값을 기준으로 테이블을 여러 개의 파티션으로 나누는 데이터베이스 파티셔닝 기법 중 하나이다.각 파티션은 특정 값 목록을 포함하며,해당 목록에 포함된 값을 가진 행들만 해당 파티션에 저장된다.

리스트 파티셔닝의 특징
*책보고 적어

리스트 파티셔닝 예시

 CREATE TABLE sales2 (
    sale_id NUMBER,
    sale_date DATE,
    amount NUMBER,
    region VARCHAR2(50)
)
PARTITION BY RANGE (sale_date) (
    PARTITION p2020 VALUES LESS THAN (DATE '2021-01-01'),
    PARTITION p2021 VALUES LESS THAN (DATE '2022-01-01'),
    PARTITION p2022 VALUES LESS THAN (DATE '2023-01-01'),
    PARTITION p2023 VALUES LESS THAN (MAXVALUE)
)




INSERT ALL
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (1, DATE '2020-10-20', 100.00, '서울')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (2, DATE '2021-05-15', 200.00, '경기')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (3, DATE '2022-01-25', 150.00, '강원')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (4, DATE '2023-07-01', 250.00, '제주')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (5, DATE '2020-12-31', 300.00, '부산')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (6, DATE '2021-08-08', 200.00, '대구')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (7, DATE '2022-03-12', 100.00, '인천')
  INTO sales2 (sale_id, sale_date, amount, region) VALUES (8, DATE '2023-11-18', 400.00, '광주')
SELECT * FROM dual;

-- EXPLAIN PLAN FOR을 활용한 실행계획 생성
EXPLAIN PLAN FOR SELECT * FROM sales2 WHERE sale_date BETWEEN DATE '2021-01-01' AND DATE '2021-12-31';

-- 실행계획 보기
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

쿼리의 조건을 보면 2021년에 해당하는 조건을 추출한다. 그리고 이 조건에 해당하는 파티션은 p2021이다. 실행계획을 보면 파티션의 범위가 2번부터 시작해서 2번까지인 것을 알 수 있다. 여기서 의미하는 2는 파티션 생성 할 때,두번째에 생성된것을 의미한다.

😺Hash Partitioning

해시파티셔닝은 특정 컬럼 값을 해시함수에 적용하여 데이터를 균등하게 여러 파티션에 분배하는 방식이다.

해시 파티셔닝 특징(책보고 적엉) 밑에는 임시..,

  • 해시 함수 기반 데이터 분배 -> 특정 컬럼 값을 해시 함수로 변환하여 파티션을 결정
  • 균등한 데이터 분배 -> 특정 파티션에 데이터가 몰리는 현상 방지(로드 밸런싱)
  • 빠른 단일 키 조회 -> 특정키(where customer_id=123)검색 시 빠름
  • 범위 조회에 부적합 -> BETWEEN, >=, <= 같은 범위 검색 시 모든 파티션을 스캔 해야할 수 있음
  • 파티션 개수 변경 어려움 -> 파티션을 추가하면 기존 데이터를 재분배 해야 함

해시 파티셔닝 예시

CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    order_date DATE,
    customer_id NUMBER,
    product_id NUMBER,
    amount NUMBER
)
PARTITION BY HASH (order_id)
(
PARTITION p1,
PARTITION P2,
PARTITION P3,
PARTITION p4
)

-- 데이터 삽입
INSERT ALL
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (1, DATE '2024-07-01', 101, 201, 1000)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (2, DATE '2024-07-01', 102, 202, 2000)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (3, DATE '2024-07-02', 103, 203, 1500)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (4, DATE '2024-07-02', 104, 204, 2500)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (5, DATE '2024-07-03', 105, 205, 3000)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (6, DATE '2024-07-03', 106, 206, 3500)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (7, DATE '2024-07-04', 107, 207, 4000)
  INTO orders (order_id, order_date, customer_id, product_id, amount) VALUES (8, DATE '2024-07-04', 108, 208, 4500)
SELECT * FROM dual;


EXPLAIN PLAN FOR SELECT * FROM ORDERS WHERE order_id = 1;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- 파티션 VALUE확인
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_PARTITION('orders', 'p1'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_PARTITION('orders', 'p2'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_PARTITION('orders', 'p3'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_PARTITION('orders', 'p4'));


SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('ORDERS', 'P4'));


SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(format => 'ALL'));

select * from orders partition (p1);
select * from orders partition (p2);
select * from orders partition (p3);
select * from orders partition (p4);
profile
냐홍

0개의 댓글