Last Updated on 8월 25, 2021 by Jade(정현호)
Serivce name : TESTDB
SID : TESTDB1 / TESTDB2
• 10gR2
2개 파라미터를 설정 합니다.(SERVICE 등록 X)
alter system set INSTANCE_GROUPS='testdb1srv ' sid='TESTDB1';
alter system set INSTANCE_GROUPS='testdb2srv ' sid='TESTDB2';
alter system set parallel_instance_group = 'testdb1srv ' sid='TESTDB1';
alter system set parallel_instance_group = 'testdb1srv ' sid='TESTDB2';
• 11gR1
instance_groups 이라는 parameter 가 11gR1 에서는 더 이상 사용되지 않고, 기본적으로 service 단위로 parallel query 가 수행되게 됩니다.
정리 : 11gR1 에서는 INSTANCE_GROUPS 를 사용하지 않으며 parallel_instance_group 와 서비스로 설정 합니다.
서비스 등록 및 parallel_instance_group 파라미터를 이용하여 parallel 쿼리 수행 시 다른 노드에 slave process 를 실행되지 않도록 설정 하는 것입니다.
먼저 진행하는 상태는 아무것도 설정하지 않은 상태 입니다(설치 후 초기 상태)
1. 테스트 테이블 생성
SQL> create table tb_test
( no number )
tablespace users;
2. 테스트 테이블에 10만건 데이터 입력
SQL> declare
i number;
begin
for i in 1..100000 loop
insert into tb_test values(i);
end loop;
commit;
end;
/
3. 스크립트 준비
3-1. mon.sql
SET linesize 200
COLUMN machine format a30
COLUMN program format a60
SQL> SELECT inst_id, machine, program
FROM gv$session
WHERE sql_id in (
SELECT sql_id
FROM gv$sqlarea
WHERE sql_text ='SELECT /*+ PARALLEL(P 4) */ * FROM TB_TEST P ORDER BY NO DESC'
)
/
3-2. parallel.sql
SQL> SELECT /*+ PARALLEL(P 4) */ *
FROM TB_TEST P ORDER BY NO DESC
/
4. 스크립트 실행
세션을 2개 접속 후 각각 쿼리를 실행하여 병렬프로세스가 모든 노드에서 구동되는지를 확인 합니다.
parallel.sql 을 실행 후 다른 세션에서 mon.sql 을 실행해서 확인 해보면 아래와 같이 모든 노드에서 parallel slave process 가 구동되고 있음을 확인 할 수 있습니다.
5. 서비스 생성 및 파라미터 적용
SQL> srvctl add service -d TESTDB -s testdb1srv -r TESTDB1
SQL> srvctl add service -d TESTDB -s testdb2srv -r TESTDB2
=> 데이터베이스 명과 instance 명은 대소문자를 구별합니다.
-d 데이터베이스명 -s 서비스명 -r 인스턴스명
6. 서비스 구동
SQL> srvctl start service -d TESTDB -s testdb1srv
SQL> srvctl start service -d TESTDB -s testdb2srv
7. 서비스 생성 확인.
crs_stat -t 로 서비스가 등록 되었는지 확인 합니다.
8. 파라미터 설정
위에서 서비스2개를 생성 되었다면 PARALLEL_INSTANCE_GROUP 설정합니다.
(sid 별로 설정)
ALTER SYSTEM SET PARALLEL_INSTANCE_GROUP=testdb1srv sid='TESTDB1';
ALTER SYSTEM SET PARALLEL_INSTANCE_GROUP=testdb2srv sid='TESTDB2';
instance 와 service 간의 연결정보는 아래의 query 를 이용합니다.
set lines 400
col service_name for a30
SQL> select s.inst_id, instance_number, instance_name,
name service_name, host_name
from gv$services s, gv$instance i
where s.inst_id=i.inst_id;
9. 테스트
설정이 완료 되었으며, 스크립트를 다시 실행하여 parallel slave process 구동을 살펴 봅니다. 테스트 방법은 4번 항목과 동일합니다.
• 11gR2
11gR2 에서는 PARALLEL_FORCE_LOCAL 파라미터 만 이용 합니다.
PARALLEL_FORCE_LOCAL 파라미터의 default 값은 FALSE 로 모든 노드에서 parallel slave process 가 실행 됨으로 이전과 같이 인스턴스내에서 수행되게 하려면 파라미터를 TRUE 로 변경 해야 합니다.
SQL> ALTER SYSTEM SET PARALLEL_FORCE_LOCAL=TRUE sid='*';
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io