database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Tutorials 17307 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 17307
Parallel query option의 사용
작성자
정재익(xlib)
작성일
2004-02-11 19:46
조회수
9,087

No. 10801

Parallel query option의 사용
----------------------------

parallel query option을 사용하면, 여러 개의 process가 하나의 SQL 문을
나누어 동시에 작업하여 성능 향상에 도움을 줄 수 있다.

여기에서는 parallel query에 대한 다음과 같은 사항을 정리하였다.
(1)  parallel query option이 사용되기에 적당한 환경
(2)  parallel query processing이 사용되어질 수 있는 SQL 문장의 종류
(3)  parallel query 수행을 위한 정의 방법
(4)  degree의 의미 및 결정
(5)  parallel query processing의 tuning 방법

 

1. PARALLEL QUERY OPTION이 사용되기에 적당한 환경

(1)  의사 결정 애플리케이션(decision support application)이나 대용량
     데이타베이스 환경 등 이러한 환경에서의 data-intensive한 연산의 성능을
     향상시킨다.
(2)  symmetric multi processor (SMP), clustered system, massively
     parallel system, 하나의 시스템에 여러개의 CPU가 있는 경우 query
     processing이 효과적으로 각 CPU에 할당되어 처리될 수 있다.
(3)  datafile이 여러 개의 disk drive에 나누어져 있는 경우 query의 대상이
     되는 데이타들이 하나의 disk에 모여 있다면, 하나의 query를 여러 개의
     process로 나누어 동시에 작업한다 하더라도 I/O 측면에서는 효과가 없다.

주의) 현재 사용 중인 시스템의 CPU와 disk controller 사용율이 이미 100%에
가깝다면, parallel query option이 오히려 부하를 증가시킬 뿐이므로 system
resource를 증가시킨 후 parallel query option을 고려하여야 한다.


2. PARALLEL QUERY PROCESSING이 사용되어질 수 있는 SQL 문장의 종류

(1)  SELECT 문장
(2)  UPDATE, INSERT, DELETE 문 내의 subquery
(3)  CREATE TABLE ... AS SELECT 문
(4)  CREATE INDEX 문

위와 같은 문장 내에 최소한 하나의 full table scan operation이 포함되어야 query가 parallelize된다.


3. PARALLEL QUERY 수행을 위한 정의 방법

parallel query가 수행되도록 하려면 다음과 같이 3가지 방법으로 정의할 수 있다.

(1)  instance level, init<SID>.ora file 내에 정의한다.
(2)  table level, create/alter table 문장에서 정의한다.
(3)  query level, PARALLEL hint에서 정의한다.

Query level의 PARALLEL hint는 table 차원의 정의와 init<SID>.ora file 내의
PARALLEL parameter에 우선한다.  마찬가지로 table 차원에서 정의된
parallelism의 degree가 init<SID>.ora 화일 내의 PARALLEL parameter에 우선
한다. 그러므로, parallel mode로 수행되는지는 instance나 table level의
check만으로는 부족하다.  또한, query 내에서 PARALLEL hint를 바르게 사용하지
못한 경우 comment로 인식되므로 주의하여야 한다.

 

주의) instance level이나 table level에 parallel query option을 거는 경우,
table의 정보가 바르게 analyze되지 않았거나, 그 외의 이유로 인하여 예상치 못한
문제를 접하는 경우가 많으므로 가능한 instance나  table level로는 parallel
query option을 setting하지 말고 필요한 query마다 hint를 이용하여 parallel을
지정하는 것이 바람직하다.

 

(1) instance level 정의

다음과 같은 init<ORACLE_SID>.ora parameter에 의해 정의된다.

parallel_max_servers
- instance 당 max slave
  (0는 parallel query option을 사용하지 않음을 의미)

parallel_min_servers
- instance가 startup 당시 최소한 뜨게 되는 slave의 수.
  만약 parallel_min_servers를 설정하지 않으면, default는 0이며,
  이 파라미터는 parallel query server가 자주 start되고 shutdown되는 경우
  일정한 갯수의 query server는 항상 떠있게 한다.

a. 7.3 미만

parallel_default_max_scans
- 하나의 query 수행을 위해 default로 사용되어지는 query server 갯수의
  최대값. 이 값은 PARALLEL hint나 table 정의 시 PARALLEL 절이 없는 경우
  영향을 미친다.
parallel_default_scansize
- table의 size가 analyze 문으로 인해 추측이 되는 경우 특정 table을 위해
  필요한 query server의 갯수를 결정하기 위해 필요한 parameter이다. 
  table의 블럭 수를 이 값으로 나누면, 그것이 query를 위해 필요한 query
  server의 갯수이다.  이렇게 계산된 query server의 갯수는
  PARALLEL_DEFAULT_MAXSCANS paramter를 초과할 수 있다.

b. 7.3 이후

parallel_min_percent
- parallel query 수행을 위해 필요한 query slave의 최소 percentage.  
parallel_min_percent / 100 개 이상의 query slave가 사용 가능하지 않으면
query는 오류를 발생시키며, 이 값이 설정되어 있지 않으면, 사용 가능한
qeury slave만을 이용하여 parallel query를 수행한다.

이 외에도 parallel_server_idl_time, parallel_default_max_instances,
recovery_parallelism 등의 parameter가 있으나, 이러한 parallel query와
관련한 어떠한 parameter도 parallel query option을 위해 반드시 필요한
것은 아니다.

 

(2) table level 정의

table은 n degree의 parallelism을 가지도록 create 혹은 alter될 수 있다.
이것은 init<SID>.ora files 내의 PARALLEL_DEFAULT_MAX_SCANS나
PARALLEL_DEFAULT_SCANSIZE가 정의되어 있더라도 이러한 값에 우선한다.
다음과 같이 지정할 수 있다.

CREATE TABLE DEPT
PARALLEL (DEGREE 5)
(DEPTNO NUMBER(2),
DNAME VARCHAR2(20));

 

(3) Query statement

PARALLEL hint를 사용하면 query에 포함된 table의 degree를 설정할 수 있다.
예를 들어, 다음과 같이 hint를 적어 degree 4로 parallel query option을
실행하도록 할 수 있다.
이 때 parallel이란 글자와 괄호( '(' )사이에 blank를 넣지 않도록 한다.
     
       select /*+ PARALLEL(emp, 4) */  * from emp;

다음과 같이 NOPARALLEL hint를 사용하면, parallel query option을 사용하지
않도록 할 수 있다.

       select /*+ NOPARALLEL(emp) */ * from emp;


4. DEGREE의 의미 및 결정

parallel query에서 degree란 하나의 operation 수행에 대한 server
process의 갯수이다. 이러한 degree 결정에 영향을 주는 요인들에는 다음과
같은 것들이 있다.

(1)  system의 CPU 갯수
(2)  system의 maximum process 갯수
(3)  table이 striping되어 있는 경우, 그 table이 걸쳐있는 disk의 갯수
(4)  data의 위치 (즉, memory에 cache되어 있는지, disk에 있는지)
(5)  query의 형태 (예를 들어 sorts 혹은 full table scan)

한 사용자만이 parallel query를 사용하는 경우, sorting이 많이 필요한
작업과 같은 CPU-bound 작업의 경우는 CPU 갯수의 1 ~ 2배의 degree가 적당하며,
sorting보다는 table scan과 같은 I/O bound 작업의 경우는 disk drive 갯수의
1 ~ 2배가 적당하다.
동시에 수행되는 parallel query가 많은 경우에는 위의 각 사용자의 degree를
줄이거나 동시에 사용하는 사용자 수를 줄여야 한다.


5.  PARALLEL QUERY PROCESSING의 TUNING 방법

(1) explain plan

explain plan을 이용하면, object_node와 other column을 이용하여 query가
어떻게 병렬로 처리되는지를 알 수 있다.
분산 환경이 아닌 경우 OBJECT_NODE 컬럼은 operation 수행 결과값이 다음 어느
operation에 사용되어지는지를 나타내며, OTHER 컬럼은 각 query server를
이용하여 어떻게 query가 진행되는지가 기술된다. OTHER 컬럼의 type이 LONG인
관계로 전체 text가 나오지 않을 경우,
$ORACLE_HOME/rdbms/admin/utlxplan.sql file 내에서 OTHER 컬럼의 type을
VARCHAR2로 바꾼 후 plan_table을 다시 만들어 수행하면, 전체 text를 확인할
수 있다.

참고) explain plan의 사용법은 <Oracle7 Server Application Developer's
Guide>나 한국오라클의 bulletin <Explain Plan 사용법>을 참조하도록 한다.

(2) parallel query 문장과 explain plan

SQL 문: SELECT /*+ parallel(dept, 4) */
 dname, MAX(sal), AVG(SAL)
       FROM dept, emp
 WHERE dept.deptno = emp.deptno
 GROUP BY dname;

위 문장 수행에 대한 explain plan의 결과는 다음과 같으며, parallel hint에
dept만 parallel query 처리하도록 지정하여 EMP를 full scan하는 부분은
OTHER 컬럼이 null인 것을 알 수 있다. 만약, dept와 emp를 모두 parallel
processing하고자 한다면 hint 지정 시 /*+ parallel(dept, 4, emp, 4) */
와 같이 지정하면 된다.

Query Plan     OBJECT_NODE
-------------------------------       --------------------------
OTHER
------------------------------------------------------------------
SELECT STATEMENT     Cost =6

    SORT GROUP BY    :Q30003
SELECT /*+ CIV_GB */ A1.C0, AVG(A1.C1), MAX(A1.C2)
FROM :Q30002 A1
GROUP BY A1.C0

    HASH JOIN     :Q30002
SELECT /*+ PIV_GB */ A1.C0 C0, AVG(A1.C1) C1, MAX(A1.C1) C2
FROM (SELECT /*+ ORDERED NO_EXPAND USE_HASH(A3) */ A2.C1 C0, A3.C1 C1,
                          A3.C1 C2
      FROM :Q30001 A2, :Q30000 A3
      WHERE A3.C0=A2.C0) A1
GROUP BY A1.C0

    TABLE ACCESS FULL DEPT  2          :Q30001
SELECT /*+ ROWID(A1) */ A1."DEPTNO" C0, A1."DNAME" C1
FROM "DEPT" A1
WHERE ROWID BETWEEN :B1 AND :B2

    TABLE ACCESS FULL EMP  1   :Q30000

(3)  parallel processing을 이용하지 않은 SQL 문장과 explain plan

SQL 문: SELECT /*+ NOPARALLEL */ dname, MAX(sal), AVG(SAL)
 FROM dept, emp
 WHERE dept.deptno = emp.deptno
 GROUP BY dname;

위의 문장에 대한 explain plan은 다음과 같이 OBJECT_NODE와 OTHER 컬럼에
어떤 값도 들어 있지 않다.

Query Plan   OBJECT_NODE           OTHER
-----------------------------   ----------------------   -----------
SELECT STATEMENT     Cost =6
  SORT GROUP BY
    HASH JOIN
      TABLE ACCESS FULL DEPT  2
      TABLE ACCESS FULL EMP  1

 

(4) dynamic view

query가 parallel mode로 실행되고 있는 중에 v$pq_sysstat를 조회하면,
parallel query server의 busy, idle 상태 및 server started, server
shtudown된 상태를 알 수 있다.

다음 예와 같이 query하면, 현재 수행되는 parallel query를 위해 사용되어지는
query server의 갯수를 알 수 있다. 이 값을 통해
parallel_min_servers의 값이나 degree의 설정에 참조할 수 있다.

os>  sqlplus system/manager
sql> select * from v$pq_sysstat where statistics = 'Servers Busy';

STATISTICS VALUE
---------------  ----------
Servers Busy      3

 

(5) OS process

OS 상태에서 다음과 같이 수행하면 현재 OS에서 구동되어 있는 parallel query
process를 확인할 수 있다. init<ORACLE_SID>.ora file 내에 parallel_min_servers의 값이 n으로 지정되어 있다면, 다음 명령을 수행하는 순간에 parallel processing에 참여하고 있는 process가 n보다 작더라도,  최소한 n개의 process가 구동되어 있게 된다.

ps -ef | grep p00
oracle  2512     1  0.0 16:03:11 ??           0:12.09 ora_p001_ORA7
oracle 29162     1  0.0 16:03:11 ??           0:30.16 ora_p000_ORA7

이 명령을 통하여 현재 구동되어 있는 parallel query process의 갯수와  현재까지 사용한 CPU time 등을 알 수 있다.

 

출처:http://211.106.111.2:8880/bulletin/list.jsp?seq=10801&pg=0&sort_by=last_updated&keyfield=subject&keyword=PARALLEL

[Top]
No.
제목
작성자
작성일
조회
17310IFS: USING FILES AND WEBFOLDER AFTER CREATING SSO USER
정재익
2004-02-11
5989
17309Direct mode에서의 parallel Data Loading
정재익
2004-02-11
6665
17308(OFS)ORACLE FAILSAFE FOR NT 와 ORACLE PARALLEL FAILSAFE와의 차이점
정재익
2004-02-11
6519
17307Parallel query option의 사용
정재익
2004-02-11
9087
17306ORACLE PARALLEL SERVER (OPS)
정재익
2004-02-11
7614
17305PARALLEL 감가 상각 PROCESS 설정 PROFILE
정재익
2004-02-11
5589
17304V8I) PARALLEL QUERY & PARALLEL DDL 사용 방법
정재익
2004-02-11
8212
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다