병렬 쿼리

  • 단일 쿼리를 여러 개의 작은 규모의 쿼리로 분할한 후에, 각각의 쿼리를 동시에 실행한 결과를 취합/조합해서 최종 결과를 반환한다.
  • 여러 개의 운영체제 프로세스 또는 쓰레드를 사용해서 수행한다.
  • 시스템 부하와 쿼리 자체를 기반으로 적절한 병렬도를 계산한다.
  • 병렬도를 고정하는 것보다 쿼리로 필요한 동시 사용 자원량을 동적으로 증감시킨다.
  • 병렬 select count(status) 상태
병렬 쿼리
{code:sqlborderStyle=solid}
select count(status) from big_table;
{code}

설정
{code:sqlborderStyle=solid}
CPU : 2

SYS@THREE >show parameter sga_target

NAME TYPE VALUE












---






--
sga_target big integer 2G

SYS@THREE >show parameter db_block_size

NAME TYPE VALUE












---






--
db_block_size integer 8192

SYS@THREE >show parameter pga_aggregate_target

NAME TYPE VALUE












---






--
pga_aggregate_target big integer 1G

|


||병렬 쿼리 테스트||
|{code:sql|borderStyle=solid}
BIG_TABLE@THREE >select count(*) from big_table;

  COUNT(*)
----------
  17139328

BIG_TABLE@THREE >explain plan for
  2  select count(status) from big_table;

Explained.

BIG_TABLE@THREE >select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 599409829

--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |     1 |     5 | 65291   (1)| 00:13:04 |
|   1 |  SORT AGGREGATE    |           |     1 |     5 |            |          |
|   2 |   TABLE ACCESS FULL| BIG_TABLE |    17M|    81M| 65291   (1)| 00:13:04 |
--------------------------------------------------------------------------------

9 rows selected.

BIG_TABLE@THREE >alter table big_table parallel 4;

Table altered.

BIG_TABLE@THREE >explain plan for
  2  select count(status) from big_table;

Explained.

BIG_TABLE@THREE >select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2894119656

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name      | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |           |     1 |     5 | 18111   (1)| 00:03:38 |        |      |            |
|   1 |  SORT AGGREGATE        |           |     1 |     5 |            |          |        |      |            |
|   2 |   PX COORDINATOR       |           |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000  |     1 |     5 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |           |     1 |     5 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |           |    17M|    81M| 18111   (1)| 00:03:38 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL| BIG_TABLE |    17M|    81M| 18111   (1)| 00:03:38 |  Q1,00 | PCWP |            |
-----------------------------------------------------------------------------------------------------------------

13 rows selected.


|

  • 병렬 쿼리 작동
    : 병렬 실행 서버들이 동시에 수행해서 생산한 중간 결과를 또 다른 병렬 실행 서버 (병렬 쿼리 coordinator)에 전달하고, 병렬 쿼리 coordinator는 중간 결과를 통합하고 결과를 출력한다
{code:noneborderStyle=solid}

oracle@primarydb ~$ ps -aef | grep 'ora_p00._THREE'
oracle 13998 1 0 18:18 ? 00:00:01 ora_p000_THREE
oracle 14002 1 0 18:18 ? 00:00:01 ora_p001_THREE
oracle 14006 1 0 18:18 ? 00:00:01 ora_p002_THREE
oracle 14010 1 0 18:18 ? 00:00:01 ora_p003_THREE
oracle 14299 13710 0 18:20 pts/0 00:00:00 grep ora_p00._THREE

|

||세션1||세션2||
|{code:none|borderStyle=solid}
BIG_TABLE@THREE >select sid from v$mystat where rownum = 1;

       SID
----------
        22

| |

{code:noneborderStyle=solid}
BIG_TABLE@THREE >select count(status) from big_table;

COUNT(STATUS)




-
17139328

 | {code:none|borderStyle=solid}
SYS@THREE >select sid, qcsid, server#, degree
  2  from v$px_session
  3  where qcsid = 22;

       SID      QCSID    SERVER#     DEGREE
---------- ---------- ---------- ----------
       793         22          1          4
        17         22          2          4
       785         22          3          4
        24         22          4          4
        22         22

SYS@THREE >select sid, username, program
  2  from v$session
  3  where sid in ( select sid from v$px_session where qcsid = 22 );

       SID USERNAME                       PROGRAM
---------- ------------------------------ ------------------------------------------------
        17 BIG_TABLE                      oracle@primarydb (P003)
        22 BIG_TABLE                      sqlplus@primarydb (TNS V1-V3)
        24 BIG_TABLE                      oracle@primarydb (P001)
       785 BIG_TABLE                      oracle@primarydb (P000)
       793 BIG_TABLE                      oracle@primarydb (P002)


|

  • 병렬 처리는 데이터가 가능한 많은 물리적 장치에 분산되어야 최적화된다.
{code:sqlborderStyle=solid}
1. RAID 스트라이핑 디스크 사용
2. 디스크의 내장형 스트라이핑에 ASM사용
3. 파티셔닝을 대량 테이블을 여러 디스크에 물리적으로 분리
4. 한 개의 테이블 스페이스에 여러 데이터 파일을 구성하여, 오라클이 여러 데이터 파일에 대량 테이블 세그먼트에 익스텐트를 할당하도록 허용
{code}

*요약*

1. 병렬 쿼리는 대량의 작업에서 수행되어야 한다.
2. 병렬 쿼리는 CPU, I/O, 메모리와 같은 자원이 충분히 확보된 경우에 수행되어야 한다.

*Parallel Statement Queuing*

오라클 11gR2 이상에서 자원 사용을 제한하는 새로은 기능으로, 데이터베이스는 동시 병렬 쿼리 수를 제한하고 추가 병렬 요청을 실행큐에 배치한다.
자원이 고갈되면 새로운 실행 요청을 활성화되지 못하도록 하고 큐에 대기하게 하고, 자원 사용이 가능해지면 큐에 있던 병렬 요청을 수행하기 시작한다.
많은 병렬 쿼리가 시스템 자원을 초과하지 않고 동시에 수행할 수 있게 한다.