안녕하세요. Oracle 에서 Parallel SQL 사용법에 대해서 간략히 알려드립니다.

 

대용량 작업의 경우 병렬처리는 작업시간을 줄여주는 고마운 존재 입니다.

물론 cpu 를 많이 가져다 쓰기 때문에 언제 어디서나 사용할 수 있는 방법은 아닙니다.

 

시스템의 사용을 내가 마음대로 해도 된다는 가정하에 memory, cpu를 마음껏 쓸 수 있다면 sort_area_size 를 늘려주고, 병렬처리를 할 때 투입될 cpu를 늘려준다면 작업시간이 단축될 것으로 예상됩니다.

 

 

병렬처리 적용 방법은 아래처럼 3가지를 일반적으로 말합니다.

1. Table 이나 index 속성에 Parallel 속성을 주면 모든 쿼리에 병렬처리가 적용됩니다. <- 일반적으로 이렇게 안씁니다.

2. seesion level에서 병렬 옵션을 주는 방법이 있다고 합니다.

3. Database level에서 병렬 옵션을 주는 방법이 있다고 합니다.

 

2. 의 경우는 서버마다 설정이 다르고 조건이 조금씩 다릅니다. DDL, DML, QUERY(SELECT) 를 수행하기 전에 alter session 으로 session 상태를 변경해야 합니다.

 

1.의 경우가 아닌 이상 병렬처리 hint를 주어야 병렬처리가 됩니다.

 

 

현재 Test는 3. 의 환경에서 합니다. Oracle 9i 입니다.

-- TLOG07TT 은 Partition Table 입니다.

 

SQL> explain plan set statement_id = 'SQL1' for SELECT COUNT(*) FROM TLOG07TT;

해석되었습니다.

경   과: 00:00:00.00
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  | Pstart| Pstop |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |       | 99556 |       |       |
|   1 |  SORT AGGREGATE      |             |     1 |       |       |       |       |
|   2 |   PARTITION RANGE ALL|             |       |       |       |     1 |    14 |
|   3 |    TABLE ACCESS FULL | TLOG07TT    |    84M|       | 99556 |     1 |    14 |
------------------------------------------------------------------------------------

Note: cpu costing is off

11 개의 행이 선택되었습니다.

경   과: 00:00:00.03

 

위의 경우는 Parallel  이 실행되지 않은 것입니다.

 

아래가 Parallel 사용 예 입니다.

 

SQL> explain plan set statement_id = 'SQL1' for SELECT /*+ PARALLEL(TLOG07TT 4)*/ COUNT(*) FROM TLOG07TT;

해석되었습니다.

경   과: 00:00:00.00
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL1', 'TYPICAL'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------
| Id  | Operation             |  Name       | Rows  | Bytes | Cost  | Pstart| Pstop |  TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |     1 |       | 24889 |       |       |      |      |            |
|   1 |  SORT AGGREGATE       |             |     1 |       |       |       |       |      |      |            |
|   2 |   SORT AGGREGATE      |             |     1 |       |       |       |       |99,00 | P->S | QC (RANDOM)|
|   3 |    PARTITION RANGE ALL|             |       |       |       |     1 |    14 |99,00 | PCWP |            |
|   4 |     TABLE ACCESS FULL | TLOG07TT    |    84M|       | 24889 |     1 |    14 |99,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------

Note: cpu costing is off

12 개의 행이 선택되었습니다.

  

위의 붉은색으로 표시된 부분이 병렬처리를 나타내는 부분입니다.

약자는 아래와 같습니다.

  P->S  : Parallel to serial

  QC : Query coordinator

  PCWP : Parallel combined with parent

 

Toad 에서는 실행계획은 Tree 형태로 보는 경우 좀 더 이쁘게 보입니다.

parallel.JPG

 

 

이 외에 PARALLEL_INDEX, INDEX_FFS 등을 사용하여 병렬처리를 지정할 수 있습니다.

 

 

 

^^

1. Partition table 아닌 Heap table의 경우는 INDEX FAST FULL SCAN 을 사용해야 병렬처리가 가능합니다.

2. 해당 hint에 정렬 순서를 지정할 수 있는 방법을 여기저기(OTN,  psoug.org) 뒤져보았지만....

정렬 순서를 지정하는 hint나 hint에 속성으로 정렬을 지정하는 것은 발견하지 못했습니다.

아시는 분 계시면 좀 알려주세요. ^^





profile