SQL 쿼리를 작성하다 보면 작은 데이터 간단한 데이터 탐색에서는 크게 무리가 되지 않지만, 많은 관계형 디비 안에서 여러개의 데이터 테이블을 조인하고 그룹화하다보면 시간이 매우 오래걸릴 때가 있다. 그 이유는 해당 쿼리를 수행하는데 순차적으로 진행되기 때문이다.
이를 위해 오라클에서는 병렬 힌트를 부여해서 쿼리 수행 시 멀티로 데이터를 가져와 빠르게 응답을 받을 수 있다.
병렬 힌트의 장점은, 어플리케이션 쪽에서 소스를 수정하지 않아도 된다는 점이며, 주석 안에서 힌트를 주는 것이기 때문에 오타가 나도 쿼리가 수행되긴 한다.
그럼, 병렬 쿼리를 사용하는 방법에 대해 알아보도록 하자.
1. 병렬 쿼리 사용 방법
먼저 병렬 처리가 가능할 수 있도록 세션에 권한을 부여한다.
SQL> ALTER SESSION ENABLE PARALLEL DML;
Session altered.
그 다음 원하는 쿼리를 작성하고 parralell 힌트를 사용해서 활성화 한다.
SQL> SELECT /*+ PARALLEL(4) */ -- select 다음 병렬 힌트 작성
COL1, COL2 -- 컬럼 작성
FROM TABLE1; -- 사용할 테이블 이름 작성
병렬 힌트를 작성할 때는 아래와 같이 3가지로 작성할 수 있다.
- /*+pararrel*/ : 자동으로 전체 쓰레드를 실행하여 병렬처리를 수행한다.
- /*+*pararrel(n)*/ : n개의 쓰레드를 실행하여 병렬처리를 수행한다. 되도록 사용할 쓰레드를 지정해주는 것이 좋다.
- /*+*parallel(tablename, n)*/ : 테이블을 지정하여 n개의 쓰레드를 실행하여 병렬초리를 수행한다.
2. 병렬 실행이 되었는지 확인하는 방법
병렬 쿼리가 실행된 경우, V$PQ_SESSTAT에 정보가기록된다.
이 내용은 병렬 쿼리가 실행될 때마다 갱신되며, 세션을 로그아웃 하는 경우 데이터가 삭제된다.
Allocation Height는 한개의 인스턴스 병렬도를 나타내며,
Allocation Weight는 RAC 구성 할 때 병렬쿼리를 실행하는 인스턴스 수를 의미한다.
따라서 병렬도는 Allocation height * Allocation Weight로 계산할 수 있다.
코드는 아래와 같이 작성하면 알 수 있다.(출처 : https://mozi.tistory.com/178)
SQL> SELECT * FROM V$PQ_SESSTAT;
STATISTIC LAST_QUERY SESSION_TOTAL CON_ID
------------------------------ ---------- ------------- ----------
Queries Parallelized 1 2 0
DML Parallelized 0 0 0
DDL Parallelized 0 0 0
DFO Trees 1 2 0
Server Threads 4 0 0
Allocation Height 4 0 0
Allocation Width 1 0 0
Local Msgs Sent 14 28 0
Distr Msgs Sent 0 0 0
Local Msgs Recv'd 14 28 0
Distr Msgs Recv'd 0 0 0
STATISTIC LAST_QUERY SESSION_TOTAL CON_ID
------------------------------ ---------- ------------- ----------
DOP 4 0 0
Slave Sets 1 0 0
13 rows selected.
Reference:
https://jack-of-all-trades.tistory.com/198
'Code > Oracle' 카테고리의 다른 글
[Oracle] Oracle Exadata의 압축방식 (Exadata Hybrid columnar Compression, EHCC) (0) | 2022.05.21 |
---|---|
[Oracle] Oracle Exadata란 무엇인가 (0) | 2022.05.14 |
[Oracle] 오라클 append와 append_values 힌트, 사용방법 (0) | 2022.04.23 |
[Oracle] 오라클 힌트(hint)의 개념, 사용법 알아보기 (0) | 2022.03.27 |
[Oracle] 오라클 WITH절을 사용하여 임시테이블 만들기 (0) | 2022.03.12 |