병렬 쿼리 | |
---|---|
{code:sql | borderStyle=solid} select count(status) from big_table; {code} |
설정 | |
---|---|
{code:sql | borderStyle=solid} CPU : 2 |
SYS@THREE >show parameter sga_target
NAME TYPE VALUE
SYS@THREE >show parameter db_block_size
NAME TYPE VALUE
SYS@THREE >show parameter pga_aggregate_target
NAME TYPE VALUE
|
||병렬 쿼리 테스트||
|{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.
|
{code:none | borderStyle=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:none | borderStyle=solid} BIG_TABLE@THREE >select count(status) from big_table; |
COUNT(STATUS)
| {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:sql | borderStyle=solid} 1. RAID 스트라이핑 디스크 사용 2. 디스크의 내장형 스트라이핑에 ASM사용 3. 파티셔닝을 대량 테이블을 여러 디스크에 물리적으로 분리 4. 한 개의 테이블 스페이스에 여러 데이터 파일을 구성하여, 오라클이 여러 데이터 파일에 대량 테이블 세그먼트에 익스텐트를 할당하도록 허용 {code} |
*요약*
1. 병렬 쿼리는 대량의 작업에서 수행되어야 한다.
2. 병렬 쿼리는 CPU, I/O, 메모리와 같은 자원이 충분히 확보된 경우에 수행되어야 한다.
*Parallel Statement Queuing*
오라클 11gR2 이상에서 자원 사용을 제한하는 새로은 기능으로, 데이터베이스는 동시 병렬 쿼리 수를 제한하고 추가 병렬 요청을 실행큐에 배치한다.
자원이 고갈되면 새로운 실행 요청을 활성화되지 못하도록 하고 큐에 대기하게 하고, 자원 사용이 가능해지면 큐에 있던 병렬 요청을 수행하기 시작한다.
많은 병렬 쿼리가 시스템 자원을 초과하지 않고 동시에 수행할 수 있게 한다.