병렬 처리는 대용량 데이터를 빠르게 처리하기 위한 핵심 기술입니다. 오라클은 다양한 병렬 처리 힌트를 제공하여 쿼리 성능을 극대화할 수 있게 해 줍니다. 이 포스트에서는 주요 병렬 처리 관련 힌트들을 자세히 살펴보고, 실제 사용 예제를 통해 그 효과를 이해해 보겠습니다.
1. PARALLEL 힌트
PARALLEL
힌트는 특정 테이블이나 인덱스에 대해 병렬 처리를 지시합니다.
문법
/*+ PARALLEL(table_name, degree) */
여기서 degree
는 병렬 처리의 정도를 나타냅니다. 숫자로 지정하거나 'DEFAULT'를 사용할 수 있습니다.
예제
SELECT /*+ PARALLEL(employees, 4) */
department_id, AVG(salary)
FROM
employees
GROUP BY
department_id;
이 예제에서는 employees
테이블에 대해 4개의 병렬 처리 프로세스를 사용하여 각 부서의 평균 급여를 계산합니다.
2. PARALLEL_INDEX 힌트
PARALLEL_INDEX
힌트는 인덱스 스캔을 병렬로 수행하도록 지시합니다.
문법
/*+ PARALLEL_INDEX(table_name, index_name, degree) */
예제
SELECT /*+ PARALLEL_INDEX(employees, emp_department_ix, 2) */
employee_id, first_name, last_name
FROM
employees
WHERE
department_id = 50;
이 예제에서는 emp_department_ix
인덱스를 2개의 병렬 프로세스로 스캔하여 50번 부서의 직원 정보를 조회합니다.
3. NO_PARALLEL 힌트
NO_PARALLEL
힌트는 병렬 처리를 비활성화합니다.
문법
/*+ NO_PARALLEL(table_name) */
예제
SELECT /*+ NO_PARALLEL(orders) */
order_id, customer_id, order_date
FROM
orders
WHERE
order_date > DATE '2023-01-01';
이 예제에서는 orders
테이블에 대해 병렬 처리를 비활성화하고 순차적으로 처리합니다.
4. PARALLEL_ENABLE 힌트
PARALLEL_ENABLE
힌트는 사용자 정의 함수에 대해 병렬 처리를 활성화합니다.
문법
CREATE FUNCTION function_name RETURN data_type
PARALLEL_ENABLE
AS
BEGIN
-- function body
END;
예제
CREATE FUNCTION get_department_name(p_dept_id NUMBER)
RETURN VARCHAR2
PARALLEL_ENABLE
AS
v_dept_name VARCHAR2(30);
BEGIN
SELECT department_name INTO v_dept_name
FROM departments
WHERE department_id = p_dept_id;
RETURN v_dept_name;
END;
이 예제에서는 부서 ID를 입력받아 부서 이름을 반환하는 함수를 병렬 처리가 가능하도록 생성합니다.
5. PQ_DISTRIBUTE 힌트
PQ_DISTRIBUTE
힌트는 병렬 쿼리 환경에서 조인 작업의 분배 방식을 지정합니다.
문법
/*+ PQ_DISTRIBUTE(table_name, outer_distribution, inner_distribution) */
예제
SELECT /*+ PQ_DISTRIBUTE(d HASH HASH) */
e.employee_id, e.first_name, e.last_name, d.department_name
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
이 예제에서는 employees
와 departments
테이블을 조인할 때, 양쪽 모두 해시 분배 방식을 사용하도록 지시합니다.
주의사항
- 병렬 처리는 시스템 리소스를 많이 사용하므로, 적절한 상황에서만 사용해야 합니다.
- 병렬 처리의 정도(degree)는 시스템의 CPU 수와 전체 워크로드를 고려하여 설정해야 합니다.
- 작은 테이블이나 간단한 쿼리에 대해서는 병렬 처리가 오히려 성능을 저하시킬 수 있습니다.
- 병렬 처리 힌트는 데이터베이스의 병렬 처리 설정과 상호작용하므로, 전체적인 데이터베이스 설정을 고려해야 합니다.
- 트랜잭션 처리가 빈번한 OLTP 시스템에서는 병렬 처리를 신중하게 사용해야 합니다.
병렬 처리 힌트는 대용량 데이터를 다루는 복잡한 쿼리의 성능을 크게 향상시킬 수 있는 강력한 도구입니다. 하지만 그 사용에는 신중한 고려가 필요합니다. 데이터의 크기, 시스템 리소스, 쿼리의 특성 등을 종합적으로 고려하여 적절히 사용해야 합니다. 올바르게 사용된 병렬 처리 힌트는 데이터 웨어하우스나 대규모 배치 작업의 성능을 극대화하는 데 큰 도움이 될 수 있습니다.