데이터이야기

DB 노하우, 데이터직무, 다양한 인터뷰를 만나보세요.

병렬 쿼리를 위한 PARALLEL 힌트를 알아봅시다.

데이터 이야기
작성자
dataonair
작성일
2015-07-30 00:00
조회
8003


병렬 쿼리를 위한 PARALLEL 힌트를 알아봅시다.

대용량의 배치나 리포트 처리를 위해 병렬 쿼리 기능을 많이
이용하고 있습니다. 이를 위해 SQL문에 PARALLEL 힌트를 사용하는 방법이 주로 사용됩니다.

참고로 오라클 11gR2(11.2.0.1)
버전부터는 구문 레벨(statement
level)
PARALLEL 힌트가 기존의 오브젝트 레벨(object level)
PARALLEL 힌트를 대체합니다. 구문 레벨와 오브젝트
레벨의 PARALLEL 힌트가 구체적으로 어떻게 다른지는 뒷부분에서 자세히 설명하겠습니다.

1. 오브젝트 레벨의 PARALLEL 힌트

먼저 10g버전까지
사용되던 오브젝트 레벨 PARALLEL 힌트
살펴보겠습니다. 오브젝트 레벨이라는 이름처럼 먼저 병렬로 처리할 대상 오브젝트(테이블, 인덱스, 쿼리블록)를 지정하고, 그 다음에 병렬도(DOP,
Degree of Parallelism)
을 지정합니다.

사용 예는 다음과 같습니다.

-- 테스트에 사용될
테이블 생성

create table t1 as

select

rownum id,

rpad(rownum,10) col1,

rpad('x',100) col2

from

all_objects

where

rownum <= 10000;

-- 오브젝트 레벨
PARALLEL 힌트를 사용한 예(t1 테이블에 대해 병렬도
4로 병렬 처리 요청)

select /*+ parallel(t1 4)
*/
count(*) from t1;

오브젝트 레벨 PARALLEL
힌트를 사용하였으니 실제로 병렬처리 되는지 실행계획을 살펴보겠습니다.

다음은 위의 PARALLEL
SQL
문에 대한 실행 계획입니다.

-----------------------------------------------------------------------

| Id | Operation | Name | Rows
| Cost (%CPU)| Time |

-----------------------------------------------------------------------

| 0 | SELECT STATEMENT |
| 1 | 7
(0)| 00:00:01 |

| 1 |
SORT AGGREGATE | |
1 | | |

| 2 | INDEX FAST FULL SCAN| T1_PK | 10000
| 7
(0)| 00:00:01 |

-----------------------------------------------------------------------

놀랍게도 오브젝트 레벨의 PARALLEL 힌트를 사용하였음에도 불구하고 병렬로 처리되지 않고 INDEX
FFS
로 처리되었습니다.

그렇다면 실행 계획 상에서만 아니라 실제로도 시리얼(INDEX FFS)로 처리되는지 알아보기 위해 다음과 같이 실행을 해보겠습니다.

SQL> select /*+
parallel(t1 4) */ count(*) from t1;

COUNT(*)

----------

10000

SQL> select *
from v$pq_tqstat;

선택된 레코드가 없습니다.
<-
실제로도 병렬로 처리되지 않았다는 사실을 확인할 수 있습니다.

그렇다면 오라클 옵티마이저가 PARALLEL 힌트를 무시한 것일까요 옵티마이저의 속마음을 알아보기
위해 10053 트레이스를 걸어서 옵티마이저가 액세스 패스(access
path)
에 대해 산정한 비용(cost)을 살펴보겠습니다.

alter system flush shared_pool;
-- 10053
트레이스를 위해서는 반드시 hard parse로 처리되어야 합니다. 이를 위해 shared pool을 강제로 flush하였습니다.

alter session set TRACEFILE_IDENTIFIER = '10053_OBJ_LEVEL1'; -- 트레이스 파일을 찾기
쉽게 파일명에 식별자를 사용합니다.

ALTER SESSION SET events <span lang="EN-US" style="fo