오라클 병렬 처리 기법
Oracle 데이터베이스에서 병렬 처리(Parallel Execution)는 대용량 데이터 처리를 효율적으로 수행하기 위해 여러 프로세스를 동시에 활용하는 기법입니다. 특히, 데이터 웨어하우스 환경이나 빅데이터 처리에서 매우 유용합니다. 병렬 처리는 쿼리 실행 시간 단축, 대량 데이터 로드, 인덱스 생성 등을 가속화하는 데 사용됩니다.
1. 병렬 처리의 기본 개념
병렬 처리는 SQL 쿼리나 DML 작업을 여러 프로세스(병렬 서버 프로세스)로 나눠서 동시에 수행합니다. 병렬 처리의 기본 구성 요소는 다음과 같습니다:
- 병렬 프로세스(Parallel Processes): 여러 프로세스가 동일한 작업을 분할하여 동시에 실행합니다.
- 병렬도(Degree of Parallelism, DOP): 작업을 수행하는 병렬 프로세스의 수입니다. 예를 들어, 병렬도가 4라면, 4개의 프로세스가 동시에 작업을 수행합니다.
2. 병렬 처리의 사용 시점
병렬 처리는 다음과 같은 작업에 유용합니다:
- 대용량 테이블에서의 SELECT 쿼리: 데이터 조회 시 병렬 처리를 통해 성능을 높일 수 있습니다.
- 데이터 로드 및 인서트 작업: 대량 데이터를 로드하거나 인서트할 때 성능을 극대화할 수 있습니다.
- 인덱스 생성 및 재구성: 대용량 테이블의 인덱스를 빠르게 생성하거나 재구성할 때 유용합니다.
- 테이블 스캔: 테이블을 전체 스캔해야 할 때 병렬 처리를 사용하여 성능을 높일 수 있습니다.
3. 병렬 처리 설정
병렬 처리를 사용하는 방법에는 여러 가지가 있습니다:
3.1. SQL 힌트를 사용한 병렬 처리
쿼리에서 직접 병렬 힌트를 추가하여 병렬도를 지정할 수 있습니다.
SELECT /*+ PARALLEL(employees, 4) */ * FROM employees;
위 쿼리는 employees
테이블을 병렬도 4로 스캔합니다. 이 힌트는 해당 SQL에만 적용됩니다.
PARALLEL(employees, 4)
: 테이블employees
에 대해 병렬도를 4로 설정합니다.
3.2. 테이블 또는 인덱스 수준에서 병렬도 설정
테이블 또는 인덱스에 병렬도를 설정할 수 있습니다. 이 설정은 해당 객체를 참조하는 모든 쿼리에 적용됩니다.
ALTER TABLE employees PARALLEL 4;
이 명령어는 employees
테이블의 기본 병렬도를 4로 설정합니다.
3.3. 자동 병렬 처리 설정
Oracle은 옵티마이저가 자동으로 병렬도를 결정하도록 설정할 수 있습니다.
ALTER SESSION ENABLE PARALLEL DML; ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
ENABLE PARALLEL DML
: 병렬 DML 작업을 활성화합니다.FORCE PARALLEL QUERY PARALLEL 4
: 모든 쿼리에 병렬도를 4로 강제합니다.
4. 병렬 처리의 내부 동작
Oracle 병렬 처리는 작업을 여러 프로세스로 분할하여 처리합니다. 예를 들어, 테이블 전체를 스캔하는 경우, 테이블을 여러 청크로 나누고 각 청크를 병렬 프로세스가 처리합니다.
병렬 처리에서 주요 작업 유형은 다음과 같습니다:
- 병렬 쿼리(Parallel Query): SELECT 문에서 사용됩니다. 테이블 스캔, 조인, 집계 작업을 병렬로 수행합니다.
- 병렬 DML(Parallel DML): INSERT, UPDATE, DELETE 작업에서 사용됩니다.
- 병렬 DDL(Parallel DDL): CREATE INDEX, CREATE TABLE AS SELECT(CTAS) 등 DDL 작업에 사용됩니다.
5. 병렬 처리의 장점과 단점
5.1. 장점
- 처리 속도 향상: 대량의 데이터를 다룰 때 병렬 처리로 성능이 크게 향상됩니다.
- 자원 최적화: 여러 CPU 코어를 효율적으로 활용하여 작업을 분산합니다.
5.2. 단점
- 자원 소모 증가: 병렬 프로세스가 많아지면 CPU, 메모리, I/O 자원을 많이 사용합니다.
- 경합 및 대기 시간: 자원이 한정된 환경에서는 병렬 프로세스 간의 경합이 발생해 오히려 성능이 저하될 수 있습니다.
- 병렬 처리 오버헤드: 작은 데이터셋에 병렬 처리를 적용하면 오히려 오버헤드가 증가해 비효율적일 수 있습니다.
6. 병렬 처리 모니터링 및 튜닝
병렬 처리의 성능을 모니터링하고 튜닝하기 위해 다음과 같은 뷰를 사용할 수 있습니다:
- V$PQ_SESSTAT: 병렬 쿼리 세션 통계를 확인합니다.
- V$PQ_TQSTAT: 병렬 처리 중 전송 큐(Transmit Queue)의 통계를 확인합니다.
- V$SQL_MONITOR: 병렬 쿼리의 실시간 모니터링 정보를 제공합니다.
6.1. 병렬도 튜닝
병렬도 설정 시 다음을 고려해야 합니다:
- 병렬도는 자원의 가용성을 고려해야 합니다: 병렬도를 너무 높게 설정하면 오히려 성능이 저하될 수 있습니다.
- 적절한 데이터 분할: 데이터를 균등하게 분할하여 병렬 프로세스 간에 작업량을 고르게 분배해야 합니다.
7. 병렬 처리 실습 예제
7.1. 대용량 테이블에서의 병렬 쿼리
SELECT /*+ PARALLEL(employees, 8) */ department_id, COUNT(*) FROM employees GROUP BY department_id;
이 쿼리는 employees
테이블을 병렬도 8로 스캔하고, 부서별로 직원 수를 계산합니다.
7.2. 병렬 DML 예제
ALTER SESSION ENABLE PARALLEL DML; INSERT /*+ PARALLEL(employees, 4) */ INTO employees_archive SELECT * FROM employees WHERE hire_date < TO_DATE('2022-01-01', 'YYYY-MM-DD');
병렬 DML을 활성화하고, 병렬도를 4로 설정하여 대량의 데이터를 병렬로 삽입합니다.
8. 병렬 처리 시 주의 사항
- 병렬 처리 시 통계 정보가 중요합니다: 옵티마이저는 최신 통계 정보를 바탕으로 병렬도를 결정합니다. 정기적으로 통계 정보를 갱신해야 합니다.
- 병렬 처리와 네트워크 부하: 네트워크를 통해 데이터를 전송하는 작업에서는 병렬 처리로 인해 네트워크 부하가 증가할 수 있습니다.
- 병렬 처리와 테이블 잠금: 병렬 DML 작업 시 테이블 잠금이 발생할 수 있으므로 주의가 필요합니다...