SlideShare una empresa de Scribd logo
1 de 11
Descargar para leer sin conexión
Part 1 ORACLE │39
배치 프로그램에서 튜닝대상 SQL 추출하기
㈜엑셈 컨설팅본부/DB컨설팅팀 박 성호
“배치 프로그램의 성능문제를 진단하기 위해 트레이스를 사용할 수 없고, 개별 SQL 에 대한 성
능점검은 비효율적인 경우에 어떻게 배치 프로그램의 성능문제를 제대로 파악하고 개선안을 도
출할 것인가?”
복잡한 로직을 가지고 있는 프로그램 (이후 배치 프로그램)에 대한 성능문제를 파악하기 위해
수행되는 모든 SQL 에 대한 개별 수행내역을 정확히 판단할 수 있어야 한다. 왜냐하면, 특정 배
치 프로그램에서 수행되는 모든 SQL 의 I/O 처리량이나 수행시간 등에 대한 정확한 정보를 추
출할 수 있다면, 배치 프로그램의 SQL 중 튜닝대상을 선별하는 작업을 효율적으로 수행할 수 있
기 때문이다.
따라서 이 문서에서 Oracle 이 제공하는 X$KGLRD 테이블과 SQL 의 수행내역을 조회할 수 있
는 Dynamic Performance View 를 활용하여 배치 프로그램에서 수행하는 SQL 의 수행정보를
추출할 수 있는 방법을 제공할 것이다. 그래야만 추출된 SQL 의 수행정보를 정확하게 분석하여
배치 프로그램의 SQL 중 튜닝대상을 제대로 선정할 수 있기 때문이다.
보통 DB 서버에서 수행되는 프로그램 (SQL 이나 배치 프로그램 등)에 대해 성능관리를 위해서,
DBMS_APPLICATION_INFO 패키지를 활용하여 MODULE 명을 설정하거나 SQL 에 식별자를
부여하는 방법을 많이 사용한다. 앞으로 이 두 방법을 사용했을 경우에 어떻게 배치 프로그램에
서 수행되는 SQL 의 수행정보를 추출할 수 있는지 기술할 것이고, 또한 이 두 방법을 적용하지
않은 경우에 SQL 의 수행정보를 추출하는 방법으로 기술할 내용은 Oracle 의 오브젝트인
PACKAGE/PROCEDURE/FUNCTION 을 이용하여 작성된 배치 프로그램에만 적용되는 점을 미
리 알린다.
본격적으로 배치 프로그램의 SQL 에 대한 수행정보를 추출하는 방법에 대해 소개하기 전에 고
객 사에서 튜닝요청을 받았던 SQL 목록에 있던 배치 프로그램을 먼저 보도록 하자.
아래의 구문은 튜닝 요청을 받은 SQL 목록에 있던 것 중 하나이다. 그런데 SQL 을 확인해 보니
성능개선이 필요한 SQL 이 아닌, JOB 으로 수행되는 P_POS_TRAN 프로시저에 대한 튜닝요청
40│2013 기술백서 White Paper
을 한 것이었다. P_POS_TRAN 프로시저는 SELECT, INSERT, UPDATE, DELETE 구문을 다양
하게 가진 약 5,000 라인의 프로그램으로, 소스 내에 또 다른 프로시저를 호출하는 등 상당히
복잡한 수행 로직을 가지고 있었다. 그런데 이렇게 복잡한 수행 로직을 가지고 있고, 점검해야
할 SQL 의 개수가 많은 프로그램에 대한 성능개선 요청을 받는 경우, 해당 프로그램에서 수행되
는 SQL 중 튜닝대상을 선별하는 것은 상당히 어려운 작업이다.
DECLARE
job BINARY_INTEGER := :job ;
next_date DATE := :mydate ;
broken BOOLEAN := FALSE ;
BEGIN P_POS_TRAN( 4 , 101 ) ; ---> 오라클 프로시저
:mydate := next_date ;
IF broken
THEN :b := 1 ;
ELSE :b := 0 ;
END IF ;
END ;
이런 경우 성능개선이 필요한 튜닝대상을 추출하는 가장 효율적인 방법은 트레이스를 통해 수행
내역을 분석하는 것이다. 그러나 앞에서 언급된 P_POS_TRAN 프로시저와 같이 데이터에 대한
입력, 변경, 삭제 작업이 있는 배치 프로그램을 운영 DB 서버에서 트레이스를 수행할 수 없다.
또한 개발 DB 서버가 아예 구성되어 있지 않거나, 개발 DB 서버에 프로그램의 테스트에 필요한
데이터가 없다면, 트레이스를 활용하여 튜닝대상을 추출하는 것은 사실상 불가능하다.
이렇게 프로그램에 트레이스를 활용하여 수행결과를 분석하는 것이 적절하지 않는 경우, 프로그
램의 성능점검을 위한 또 다른 방법으로 프로그램의 모든 SQL 에 대한 성능점검 (플랜 점검 등)
을 수행하게 된다. 그런데 이 방법은 튜닝요청을 받은 후 프로그램에 대한 성능개선안을 도출하
는데 까지 많은 시간이 소요될 것이고, 또한 성능문제를 정확하게 판단하지 못할 수 있어 비효율
적인 방법이다. 왜냐하면, 프로그램의 전체 수행시간 (Elapsed Time) 중 가장 많은 비중을 차지
하는 SQL 을 개선해야 하나, 해당 SQL 이 Loop 구문 안에서 수행되고, 1 회 수행 시 발생하는
I/O 처리량과 수행시간이 타 SQL 에 비해 적어 튜닝대상으로 추출되지 않을 수도 있기 때문이
다.
앞에서와 같이 트레이스 수행이나 배치 프로그램의 모든 SQL 에 대한 개별 성능점검을 통해 성
능개선안을 도출하는 것이 힘든 경우가 있다. 이럴 때 우리는 배치 프로그램의 튜닝대상 SQL 을
Part 1 ORACLE │41
선별하기 위해서 SQL 의 수행정보를 추출하는 방법으로 Oracle 이 제공하는 정보를 원활하게
조회하여 활용할 수 있다면 좀더 쉽고, 효율적이고, 빠르게 배치 프로그램에 대한 성능개선을 할
수 있을 것이다.
그럼 Oracle 이 제공하는 X$KGLRD 테이블과 SQL 의 수행내역을 조회할 수 있는 Dynamic
Performance View 를 활용하는 방법을 알아보도록 하자.
테스트를 진행하면서 내용을 확인하기 위해서 먼저 테스트 데이터를 생성하도록 하자.
Script. 배치 프로그램 테스트 데이터 생성
* 테이블 생성하기
drop table plsql_t1 purge;
create table plsql_t1
as
select level as c1, chr(65+mod(level,26)) as c2, level+99999 as c3
from dual
connect by level <= 1000000 ;
* 인덱스 생성 및 통계정보 수집하기
create index plsql_t1_idx_01 on plsql_t1 ( c1 ) ;
exec
dbms_stats.gather_table_stats(ownname=>'exem',tabname=>'plsql_t1',cascade=>true,estima
te_percent=>100) ;
* 프로시저 생성하기
drop procedure plsql_batch_1 ;
drop procedure plsql_batch_2 ;
create or replace procedure plsql_batch_1
as
begin
delete /*+ BatchTest_plsql_batch_1 */ plsql_t1 ---> SQL 에 식별자 부여
where c2 = 'aa';
commit;
42│2013 기술백서 White Paper
end;
/
create or replace procedure plsql_batch_2
as
begin
dbms_application_info.set_module('BatchTest',''); ---> Module Name 설정
insert /*+ BatchTest_plsql_batch_2 */ into plsql_t1 ---> SQL 에 식별자 부여
select c1, 'a', c3
from plsql_t1
where c2 = 'A';
commit;
update /*+ BatchTest_plsql_batch_2 */ plsql_t1 ---> SQL 에 식별자 부여
set c2 = 'aa'
where c2 = 'a';
commit;
plsql_batch_1; ---> 데이터 delete
end;
/
배치 프로그램의 수행내역을 확인하기 위해서 앞에서 생성한 PLSQL_BATCH_2 프로시저를 수
행한다.
SQL> exec plsql_batch_2 ;
PLSQL_BATCH_2 의 소스 내용을 보면, DBMS_APPLICATION_INFO.SET_MODULE 으로
MODULE 명을 설정했다. 그리고 INSERT, UPDATE 구문에 SQL 설명을 가지는 주석을 추가하
였다. 프로시저에 적용한 이 두 가지는 일반적으로 배치 프로그램이나 단일 SQL 의 성능관리를
위해 사용되는 방법이다. 만약 튜닝요청을 받은 배치 프로그램에 둘 중 한 가지라도 설정되어 있
는 경우는 SQL 의 수행정보를 가지고 있는 V$SQLAREA 와 같은 Dictionary View 를 활용하여
튜닝대상을 추출할 수 있다. 그러나 둘 중 어떤 것도 설정되어 있지 않다면 튜닝대상을 추출하는
것은 어려워진다.
그럼 앞에서 언급한 프로그램이나 SQL 에 식별자를 부여한 경우와 부여하지 않은 경우에 따라
어떻게 튜닝대상을 추출할 수 있는지 알아보도록 하자.
Part 1 ORACLE │43
MODULE명 또는 SQL에 식별자가 있는 경우
MODULE명이 설정되어 있는 경우
PLSQL_BATCH_2 의 소스 내용을 확인해 보면, 아래와 같이 해당 배치 프로그램에 MODULE 명
을 설정하였다.
dbms_application_info.set_module('BatchTest',''); ---> Module 명 설정
Oracle 11.2.0.3 에서 테스트를 수행한 결과 PLSQL_BATCH_2 프로시저에 적용한 MODULE
명은 PLSQL_BATCH_2 프로시저에서 호출하는 PLSQL_BATCH_1 에도 적용되기 때문에, 배치
프로그램에서 수행되는 모든 SQL 의 수행정보를 V$SQL 의 MODULE 칼럼으로 조회가 가능하
다.
해당 배치 프로그램에 MODULE 명이 설정되어 있다고 가정하고, 배치 프로그램에서 수행하는
모든 SQL 중, 총 I/O 처리량이 많이 발생한 순서대로 정렬하여 추출하고자 한다면 아래의 스크
립트를 수행하면 된다.
select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets
from (
select parsing_schema_name Schema, --> 1
module, --> 2
sql_id, --> 3
hash_value, --> 4
substr(sql_text,1,37) substr_sqltext --> 5
executions, --> 6
buffer_gets, --> 7
disk_reads, --> 8
rows_processed, --> 9
round(buffer_gets/executions,1) lio, --> 10
round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11
round(cpu_time/executions/1000000,1) cpu_sec --> 12
from v$sqlarea s
where s.module = ‘BatchTest’ ---> MODULE 명으로 검색
order by 7 desc ---> 전체 I/O 처리량이 높은 순으로 정렬
) t1
where rownum <= 50 ;
44│2013 기술백서 White Paper
MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS
------------- --------------------------------------- ---------- -----------
BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206
BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014
BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901
SQL TEXT로 식별할 수 있는 경우
앞에서 PLSQL_BATCH_1, PLSQL_BATCH_2 을 생성할 때, 아래와 같이 개별 SQL 에 식별자를
추가하였다.
delete /*+ BatchTest_plsql_batch_1 */ …
insert /*+ BatchTest_plsql_batch_2 */ …
update /*+ BatchTest_plsql_batch_2 */ …
배치 프로그램의 모든 SQL 에 식별자를 추가했으므로, 아래와 같이 배치 프로그램의 모든 SQL
에 대한 수행정보를 조회할 수 있다.
select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets
from (
select parsing_schema_name Schema, --> 1
module, --> 2
sql_id, --> 3
hash_value, --> 4
substr(sql_text,1,37) substr_sqltext, --> 5
executions, --> 6
buffer_gets, --> 7
disk_reads, --> 8
rows_processed, --> 9
round(buffer_gets/executions,1) lio, --> 10
round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11
round(cpu_time/executions/1000000,1) cpu_sec --> 12
from v$sqlarea s
where s.sql_fulltext like ‘%BatchTest_plsql_batch%’ ---> SQL TEXT 로 검색
order by 7 desc
) t1
where rownum <= 50 ;
MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS
------------- --------------------------------------- ---------- -----------
Part 1 ORACLE │45
BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206
BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014
BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901
MODULE명 또는 SQL에 식별자가 없는 경우
앞에서 PLSQL_BATCH_1, PLSQL_BATCH_2 프로시저 생성 시 MODULE 명 설정이나 SQL 에
식별자를 추가하지 않았다면, 어떻게 튜닝대상을 추출할 수 있을까? 이런 경우 Oracle 이 제공
하는 X$KGLRD 테이블과 DBA_OBJECTS.OBJECTID 와 V$SQL.PROGRAM_ID 으로 배치 프
로그램에서 튜닝대상 SQL 을 추출할 수 있다.
Note. Oracle 버전이 10g 이전까지는 X$KGLRD 를 활용하여 추출해야 한다. 왜냐하면, 10g 이후
버전에 V$SQL 나 V$SQLAREA 에 PROGRAM_ID 가 추가되었기 때문이다.
X$KGLRD 활용하기
아래에 X$KGLRD 의 칼럼 정보와 테스트 예제를 통해 사용방법을 알아보도록 하자.
x$kglrd 칼럼 구성 - Oracle Version: 11.2.0.3 에서 추출
Column Name DataType
----------------------- ---------------
ADDR RAW(4)
INDX NUMBER
INST_ID NUMBER
KGLHDCDR RAW(4)
KGLNAOWN VARCHAR2(64)
KGLNACNM VARCHAR2(512) -----> Procedure & Function Name
KGLNACNL NUMBER
KGLNACHV NUMBER
KGLHDPDR RAW(4)
KGLDEPNO NUMBER
KGLRDHDL RAW(4)
KGLNADNM VARCHAR2(512) -----> SQL Text
KGLNADNL NUMBER
KGLNADHV NUMBER -----> SQL Hash Value
46│2013 기술백서 White Paper
KGLRDFLG NUMBER
Oracle 이 제공하는 X$KGLRD 은 SQL 의 수행정보를 담고 있는데, 특정 PROCEDURE 나
FUNCTION 내에서 수행되는 SQL 에 대해 오브젝트명과 함께 확인할 수 있기 때문에, 특정 배치
프로그램에서 수행되는 모든 SQL 을 추출하고자 할 때 유용하다.
Procedure/Function 명으로 조회하기
PROCEDURE 나 FUNCTION 명은 대문자로 입력되어 있으므로 조회 시 유의하자. X$KGLRD
에서 PROCEDURE 나 FUNCTION 명으로 조회할 경우에 PLSQL_BATCH_2 프로시저에서 호출
하는 PLSQL_BATCH_1 도 같이 조회해야 전체 SQL 을 추출할 수 있다.
col kglnacnm for a15
col kglnadnm for a37
set pagesize 100
select kglnacnm, substr(kglnadnm,1,37) kglnadnm, kglnadhv
from x$kglrd
where kglnacnm in ('PLSQL_BATCH_2', 'PLSQL_BATCH_1') ;
KGLNACNM KGLNADNM KGLNADHV
--------------- ------------------------------------- ----------
PLSQL_BATCH_2 UPDATE /*+ BatchTest_plsql_batch_2 */ 3943223768
PLSQL_BATCH_2 COMMIT 255718823
PLSQL_BATCH_2 INSERT /*+ BatchTest_plsql_batch_2 */ 111618107
PLSQL_BATCH_1 COMMIT 255718823
PLSQL_BATCH_1 DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916
SQL 을 SQL Text 로 조회하기
SQL Text 로 X$KGLRD 에서 조회할 경우에는 아래와 같이 수행하면 된다.
select distinct substr(kglnadnm,1,37) kglnadnm, kglnadhv
from x$kglrd
where kglnadnm like '%BatchTest_plsql_batch%';
KGLNADNM KGLNADHV
Part 1 ORACLE │47
------------------------------------- ----------
UPDATE /*+ BatchTest_plsql_batch_2 */ 3943223768
DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916
INSERT /*+ BatchTest_plsql_batch_2 */ 111618107
SQL 을 Hash Value 로 조회하기
DB 서버를 모니터링 시 Hash_Value 를 알고 있을 때, 만약 해당 SQL 이 배치 프로그램에서 수
행되는 경우에 어떤 프로그램에서 수행된 것인지 찾아야 할 때 아래와 같이 Hash_Value 로
X$KGLRD 에서 조회하면 확인할 수 있다.
select distinct substr(kglnadnm,1,37) kglnadnm, kglnadhv
from x$kglrd
where kglnadhv = 3094796916 ;
KGLNADNM KGLNADHV
------------------------------------- ----------
DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916
튜닝대상 추출하기
X$KGLRD 을 활용하여 배치 프로그램에서 수행된 SQL 을 추출 후, 아래와 같이 각 SQL 의 수
행정보를 분석 후 튜닝대상을 추출하면 된다.
select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets
from (
select parsing_schema_name Schema, --> 1
module, --> 2
sql_id, --> 3
hash_value, --> 4
substr(sql_text,1,37) substr_sqltext, --> 5
executions, --> 6
buffer_gets, --> 7
disk_reads, --> 8
rows_processed, --> 9
round(buffer_gets/executions,1) lio, --> 10
round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11
round(cpu_time/executions/1000000,1) cpu_sec --> 12
from v$sqlarea s
48│2013 기술백서 White Paper
where s.hash_value in (3943223768, 3094796916, 111618107)
order by 7 desc
) t1
where rownum <= 50 ;
MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS
------------- --------------------------------------- ---------- -----------
BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206
BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014
BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901
DBA_OBJECTS & V$SQLAREA 활용하기
Oracle 버전이 10g 이후부터 V$SQL 과 V$SQLAREA 에 PROGRAM_ID 칼럼이 추가되었다.
PROGRAM_ID 칼럼은 DBA_OBJECTS 의 OBJECT_ID 칼럼과 연결이 된다. 그러므로
PROCEDURE 나 FUNCTION 으로 작성된 배치 프로그램의 경우, DBA_OBJECTS 와 V$SQL
[V$SQLAREA]을 통해 튜닝대상 SQL 을 추출할 수 있다.
먼저 배치 프로그램 명으로 OBJECT_ID 를 추출한다.
select object_name, object_id
from dba_objects
where object_name IN ('PLSQL_BATCH_1','PLSQL_BATCH_2') ;
OBJECT_NAME OBJECT_ID
-------------------- ----------
PLSQL_BATCH_1 61738
PLSQL_BATCH_2 61739
DBA_OBJECTS 에서 추출된 OBJECT_ID 값으로 V$SQLAREA 의 PROGRAM_ID 와 연결하여
조회하면 아래와 같이 SQL 을 추출할 수 있다.
col substr_text for a30
col module for a15
select substr(sql_text,1,30) substr_text, module, program_id
from v$sqlarea
where program_id in (61738, 61739) ;
Part 1 ORACLE │49
SUBSTR_TEXT MODULE PROGRAM_ID
------------------------------ --------------- ----------
UPDATE /*+ BatchTest_plsql_bat BatchTest 61739
DELETE /*+ BatchTest_plsql_bat BatchTest 61738
INSERT /*+ BatchTest_plsql_bat BatchTest 61739
앞에서 DBA_OBJECTS 와 V$SQLAREA 를 활용하여, 해당 배치 프로그램에서 수행한 모든
SQL 에 대한 수행정보를 아래와 같이 조회할 수 있다. 그리고 조회된 정보를 면밀히 분석하면
배치 프로그램의 SQL 중 튜닝대상을 추출하는 것은 그리 어렵지 않을 것이다.
select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets
from (
select parsing_schema_name Schema, --> 1
module, --> 2
sql_id, --> 3
hash_value, --> 4
substr(sql_text,1,37) substr_sqltext, --> 5
executions, --> 6
buffer_gets, --> 7
disk_reads, --> 8
rows_processed, --> 9
round(buffer_gets/executions,1) lio, --> 10
round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11
round(cpu_time/executions/1000000,1) cpu_sec --> 12
from v$sqlarea s
where s.program_id in ( select object_id
from dba_objects
where object_name in ( 'PLSQL_BATCH_1',
'PLSQL_BATCH_2') )
order by 7 desc
) t1
where rownum <= 50 ;
MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS
------------- --------------------------------------- ---------- -----------
BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206
BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014
BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901

Más contenido relacionado

La actualidad más candente

ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracleORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle엑셈
 
대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle엑셈
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle엑셈
 
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracleSQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle엑셈
 
Commit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracleCommit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracle엑셈
 
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracleWINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracle엑셈
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3Seok-joon Yun
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4Seok-joon Yun
 
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2Seok-joon Yun
 
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1Seok-joon Yun
 
SSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracleSSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracle엑셈
 
오렌지6.0 교육자료
오렌지6.0 교육자료오렌지6.0 교육자료
오렌지6.0 교육자료Seok-joon Yun
 
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstatSeok-joon Yun
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개
[Pgday.Seoul 2018]  PostgreSQL 11 새 기능 소개[Pgday.Seoul 2018]  PostgreSQL 11 새 기능 소개
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개PgDay.Seoul
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124한 경만
 
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Jiho Lee
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기I Goo Lee
 

La actualidad más candente (20)

ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracleORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
 
대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle
 
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracleSQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
 
Commit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracleCommit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracle
 
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracleWINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
[2015-06-19] Oracle 성능 최적화 및 품질 고도화 2
 
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
[2015-06-12] Oracle 성능 최적화 및 품질 고도화 1
 
SSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracleSSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracle
 
오렌지6.0 교육자료
오렌지6.0 교육자료오렌지6.0 교육자료
오렌지6.0 교육자료
 
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...
오라클 커서(Cursor) 개념 및 오라클 메모리 구조_PL/SQL,오라클커서강좌,SGA, PGA, UGA, Shared Pool, Sha...
 
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개
[Pgday.Seoul 2018]  PostgreSQL 11 새 기능 소개[Pgday.Seoul 2018]  PostgreSQL 11 새 기능 소개
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124
 
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기
 

Destacado

Userful 제품안내(다담데이타)
Userful 제품안내(다담데이타)Userful 제품안내(다담데이타)
Userful 제품안내(다담데이타)Minsik Kim
 
웹 사이트의 성능 높이기 Part1
웹 사이트의 성능 높이기 Part1웹 사이트의 성능 높이기 Part1
웹 사이트의 성능 높이기 Part1kisu kim
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm엑셈
 
All about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apmAll about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apm엑셈
 
Runtime Data Areas_Wh apm
Runtime Data Areas_Wh apmRuntime Data Areas_Wh apm
Runtime Data Areas_Wh apm엑셈
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm엑셈
 
네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm엑셈
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm엑셈
 
스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm엑셈
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm엑셈
 
웹 서버의 기능 및 역할_Wh apm
웹 서버의 기능 및 역할_Wh apm웹 서버의 기능 및 역할_Wh apm
웹 서버의 기능 및 역할_Wh apm엑셈
 
TP-Monitor_Wh apm
TP-Monitor_Wh apmTP-Monitor_Wh apm
TP-Monitor_Wh apm엑셈
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apm엑셈
 

Destacado (13)

Userful 제품안내(다담데이타)
Userful 제품안내(다담데이타)Userful 제품안내(다담데이타)
Userful 제품안내(다담데이타)
 
웹 사이트의 성능 높이기 Part1
웹 사이트의 성능 높이기 Part1웹 사이트의 성능 높이기 Part1
웹 사이트의 성능 높이기 Part1
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm
 
All about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apmAll about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apm
 
Runtime Data Areas_Wh apm
Runtime Data Areas_Wh apmRuntime Data Areas_Wh apm
Runtime Data Areas_Wh apm
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm
 
네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm
 
스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm
 
웹 서버의 기능 및 역할_Wh apm
웹 서버의 기능 및 역할_Wh apm웹 서버의 기능 및 역할_Wh apm
웹 서버의 기능 및 역할_Wh apm
 
TP-Monitor_Wh apm
TP-Monitor_Wh apmTP-Monitor_Wh apm
TP-Monitor_Wh apm
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apm
 

Similar a 배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle

제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancementsbeamofhope
 
Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQLJAEGEUN YU
 
생체 광학 데이터 분석 AI 경진대회 1위 수상작
생체 광학 데이터 분석 AI 경진대회 1위 수상작생체 광학 데이터 분석 AI 경진대회 1위 수상작
생체 광학 데이터 분석 AI 경진대회 1위 수상작DACON AI 데이콘
 
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴Devgear
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQLI Goo Lee
 
효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차희동 강
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기Kenu, GwangNam Heo
 

Similar a 배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle (20)

1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace
 
1.8 튜닝의도구 dbms xplan
1.8 튜닝의도구 dbms xplan1.8 튜닝의도구 dbms xplan
1.8 튜닝의도구 dbms xplan
 
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)
 
제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements제1회 Tech Net Sql Server 2005 T Sql Enhancements
제1회 Tech Net Sql Server 2005 T Sql Enhancements
 
Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQL
 
3.2 실행계획 sql 연산 (concatenation)
3.2 실행계획 sql 연산 (concatenation)3.2 실행계획 sql 연산 (concatenation)
3.2 실행계획 sql 연산 (concatenation)
 
생체 광학 데이터 분석 AI 경진대회 1위 수상작
생체 광학 데이터 분석 AI 경진대회 1위 수상작생체 광학 데이터 분석 AI 경진대회 1위 수상작
생체 광학 데이터 분석 AI 경진대회 1위 수상작
 
Sql기초강좌2_SET AUTOTRACE_SQL교육
Sql기초강좌2_SET AUTOTRACE_SQL교육Sql기초강좌2_SET AUTOTRACE_SQL교육
Sql기초강좌2_SET AUTOTRACE_SQL교육
 
1.9 튜닝의도구 10053 event
1.9 튜닝의도구 10053 event1.9 튜닝의도구 10053 event
1.9 튜닝의도구 10053 event
 
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
 
3.6 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN)
3.6 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN)3.6 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN)
3.6 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN)
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
 
1.6 cursor sharing 파라미터
1.6 cursor sharing 파라미터1.6 cursor sharing 파라미터
1.6 cursor sharing 파라미터
 
2.1 optimizer mode를 변경하는 힌트(rule)
2.1 optimizer mode를 변경하는 힌트(rule)2.1 optimizer mode를 변경하는 힌트(rule)
2.1 optimizer mode를 변경하는 힌트(rule)
 
효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차
 
3.5 실행계획 SQL 연산 (HASH SEMI-JOIN)
3.5 실행계획 SQL 연산 (HASH SEMI-JOIN)3.5 실행계획 SQL 연산 (HASH SEMI-JOIN)
3.5 실행계획 SQL 연산 (HASH SEMI-JOIN)
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
 
3.4 실행계획 SQL 연산 (Hash Anti-Join)
3.4 실행계획 SQL 연산 (Hash Anti-Join)3.4 실행계획 SQL 연산 (Hash Anti-Join)
3.4 실행계획 SQL 연산 (Hash Anti-Join)
 
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
 

배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle

  • 1. Part 1 ORACLE │39 배치 프로그램에서 튜닝대상 SQL 추출하기 ㈜엑셈 컨설팅본부/DB컨설팅팀 박 성호 “배치 프로그램의 성능문제를 진단하기 위해 트레이스를 사용할 수 없고, 개별 SQL 에 대한 성 능점검은 비효율적인 경우에 어떻게 배치 프로그램의 성능문제를 제대로 파악하고 개선안을 도 출할 것인가?” 복잡한 로직을 가지고 있는 프로그램 (이후 배치 프로그램)에 대한 성능문제를 파악하기 위해 수행되는 모든 SQL 에 대한 개별 수행내역을 정확히 판단할 수 있어야 한다. 왜냐하면, 특정 배 치 프로그램에서 수행되는 모든 SQL 의 I/O 처리량이나 수행시간 등에 대한 정확한 정보를 추 출할 수 있다면, 배치 프로그램의 SQL 중 튜닝대상을 선별하는 작업을 효율적으로 수행할 수 있 기 때문이다. 따라서 이 문서에서 Oracle 이 제공하는 X$KGLRD 테이블과 SQL 의 수행내역을 조회할 수 있 는 Dynamic Performance View 를 활용하여 배치 프로그램에서 수행하는 SQL 의 수행정보를 추출할 수 있는 방법을 제공할 것이다. 그래야만 추출된 SQL 의 수행정보를 정확하게 분석하여 배치 프로그램의 SQL 중 튜닝대상을 제대로 선정할 수 있기 때문이다. 보통 DB 서버에서 수행되는 프로그램 (SQL 이나 배치 프로그램 등)에 대해 성능관리를 위해서, DBMS_APPLICATION_INFO 패키지를 활용하여 MODULE 명을 설정하거나 SQL 에 식별자를 부여하는 방법을 많이 사용한다. 앞으로 이 두 방법을 사용했을 경우에 어떻게 배치 프로그램에 서 수행되는 SQL 의 수행정보를 추출할 수 있는지 기술할 것이고, 또한 이 두 방법을 적용하지 않은 경우에 SQL 의 수행정보를 추출하는 방법으로 기술할 내용은 Oracle 의 오브젝트인 PACKAGE/PROCEDURE/FUNCTION 을 이용하여 작성된 배치 프로그램에만 적용되는 점을 미 리 알린다. 본격적으로 배치 프로그램의 SQL 에 대한 수행정보를 추출하는 방법에 대해 소개하기 전에 고 객 사에서 튜닝요청을 받았던 SQL 목록에 있던 배치 프로그램을 먼저 보도록 하자. 아래의 구문은 튜닝 요청을 받은 SQL 목록에 있던 것 중 하나이다. 그런데 SQL 을 확인해 보니 성능개선이 필요한 SQL 이 아닌, JOB 으로 수행되는 P_POS_TRAN 프로시저에 대한 튜닝요청
  • 2. 40│2013 기술백서 White Paper 을 한 것이었다. P_POS_TRAN 프로시저는 SELECT, INSERT, UPDATE, DELETE 구문을 다양 하게 가진 약 5,000 라인의 프로그램으로, 소스 내에 또 다른 프로시저를 호출하는 등 상당히 복잡한 수행 로직을 가지고 있었다. 그런데 이렇게 복잡한 수행 로직을 가지고 있고, 점검해야 할 SQL 의 개수가 많은 프로그램에 대한 성능개선 요청을 받는 경우, 해당 프로그램에서 수행되 는 SQL 중 튜닝대상을 선별하는 것은 상당히 어려운 작업이다. DECLARE job BINARY_INTEGER := :job ; next_date DATE := :mydate ; broken BOOLEAN := FALSE ; BEGIN P_POS_TRAN( 4 , 101 ) ; ---> 오라클 프로시저 :mydate := next_date ; IF broken THEN :b := 1 ; ELSE :b := 0 ; END IF ; END ; 이런 경우 성능개선이 필요한 튜닝대상을 추출하는 가장 효율적인 방법은 트레이스를 통해 수행 내역을 분석하는 것이다. 그러나 앞에서 언급된 P_POS_TRAN 프로시저와 같이 데이터에 대한 입력, 변경, 삭제 작업이 있는 배치 프로그램을 운영 DB 서버에서 트레이스를 수행할 수 없다. 또한 개발 DB 서버가 아예 구성되어 있지 않거나, 개발 DB 서버에 프로그램의 테스트에 필요한 데이터가 없다면, 트레이스를 활용하여 튜닝대상을 추출하는 것은 사실상 불가능하다. 이렇게 프로그램에 트레이스를 활용하여 수행결과를 분석하는 것이 적절하지 않는 경우, 프로그 램의 성능점검을 위한 또 다른 방법으로 프로그램의 모든 SQL 에 대한 성능점검 (플랜 점검 등) 을 수행하게 된다. 그런데 이 방법은 튜닝요청을 받은 후 프로그램에 대한 성능개선안을 도출하 는데 까지 많은 시간이 소요될 것이고, 또한 성능문제를 정확하게 판단하지 못할 수 있어 비효율 적인 방법이다. 왜냐하면, 프로그램의 전체 수행시간 (Elapsed Time) 중 가장 많은 비중을 차지 하는 SQL 을 개선해야 하나, 해당 SQL 이 Loop 구문 안에서 수행되고, 1 회 수행 시 발생하는 I/O 처리량과 수행시간이 타 SQL 에 비해 적어 튜닝대상으로 추출되지 않을 수도 있기 때문이 다. 앞에서와 같이 트레이스 수행이나 배치 프로그램의 모든 SQL 에 대한 개별 성능점검을 통해 성 능개선안을 도출하는 것이 힘든 경우가 있다. 이럴 때 우리는 배치 프로그램의 튜닝대상 SQL 을
  • 3. Part 1 ORACLE │41 선별하기 위해서 SQL 의 수행정보를 추출하는 방법으로 Oracle 이 제공하는 정보를 원활하게 조회하여 활용할 수 있다면 좀더 쉽고, 효율적이고, 빠르게 배치 프로그램에 대한 성능개선을 할 수 있을 것이다. 그럼 Oracle 이 제공하는 X$KGLRD 테이블과 SQL 의 수행내역을 조회할 수 있는 Dynamic Performance View 를 활용하는 방법을 알아보도록 하자. 테스트를 진행하면서 내용을 확인하기 위해서 먼저 테스트 데이터를 생성하도록 하자. Script. 배치 프로그램 테스트 데이터 생성 * 테이블 생성하기 drop table plsql_t1 purge; create table plsql_t1 as select level as c1, chr(65+mod(level,26)) as c2, level+99999 as c3 from dual connect by level <= 1000000 ; * 인덱스 생성 및 통계정보 수집하기 create index plsql_t1_idx_01 on plsql_t1 ( c1 ) ; exec dbms_stats.gather_table_stats(ownname=>'exem',tabname=>'plsql_t1',cascade=>true,estima te_percent=>100) ; * 프로시저 생성하기 drop procedure plsql_batch_1 ; drop procedure plsql_batch_2 ; create or replace procedure plsql_batch_1 as begin delete /*+ BatchTest_plsql_batch_1 */ plsql_t1 ---> SQL 에 식별자 부여 where c2 = 'aa'; commit;
  • 4. 42│2013 기술백서 White Paper end; / create or replace procedure plsql_batch_2 as begin dbms_application_info.set_module('BatchTest',''); ---> Module Name 설정 insert /*+ BatchTest_plsql_batch_2 */ into plsql_t1 ---> SQL 에 식별자 부여 select c1, 'a', c3 from plsql_t1 where c2 = 'A'; commit; update /*+ BatchTest_plsql_batch_2 */ plsql_t1 ---> SQL 에 식별자 부여 set c2 = 'aa' where c2 = 'a'; commit; plsql_batch_1; ---> 데이터 delete end; / 배치 프로그램의 수행내역을 확인하기 위해서 앞에서 생성한 PLSQL_BATCH_2 프로시저를 수 행한다. SQL> exec plsql_batch_2 ; PLSQL_BATCH_2 의 소스 내용을 보면, DBMS_APPLICATION_INFO.SET_MODULE 으로 MODULE 명을 설정했다. 그리고 INSERT, UPDATE 구문에 SQL 설명을 가지는 주석을 추가하 였다. 프로시저에 적용한 이 두 가지는 일반적으로 배치 프로그램이나 단일 SQL 의 성능관리를 위해 사용되는 방법이다. 만약 튜닝요청을 받은 배치 프로그램에 둘 중 한 가지라도 설정되어 있 는 경우는 SQL 의 수행정보를 가지고 있는 V$SQLAREA 와 같은 Dictionary View 를 활용하여 튜닝대상을 추출할 수 있다. 그러나 둘 중 어떤 것도 설정되어 있지 않다면 튜닝대상을 추출하는 것은 어려워진다. 그럼 앞에서 언급한 프로그램이나 SQL 에 식별자를 부여한 경우와 부여하지 않은 경우에 따라 어떻게 튜닝대상을 추출할 수 있는지 알아보도록 하자.
  • 5. Part 1 ORACLE │43 MODULE명 또는 SQL에 식별자가 있는 경우 MODULE명이 설정되어 있는 경우 PLSQL_BATCH_2 의 소스 내용을 확인해 보면, 아래와 같이 해당 배치 프로그램에 MODULE 명 을 설정하였다. dbms_application_info.set_module('BatchTest',''); ---> Module 명 설정 Oracle 11.2.0.3 에서 테스트를 수행한 결과 PLSQL_BATCH_2 프로시저에 적용한 MODULE 명은 PLSQL_BATCH_2 프로시저에서 호출하는 PLSQL_BATCH_1 에도 적용되기 때문에, 배치 프로그램에서 수행되는 모든 SQL 의 수행정보를 V$SQL 의 MODULE 칼럼으로 조회가 가능하 다. 해당 배치 프로그램에 MODULE 명이 설정되어 있다고 가정하고, 배치 프로그램에서 수행하는 모든 SQL 중, 총 I/O 처리량이 많이 발생한 순서대로 정렬하여 추출하고자 한다면 아래의 스크 립트를 수행하면 된다. select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets from ( select parsing_schema_name Schema, --> 1 module, --> 2 sql_id, --> 3 hash_value, --> 4 substr(sql_text,1,37) substr_sqltext --> 5 executions, --> 6 buffer_gets, --> 7 disk_reads, --> 8 rows_processed, --> 9 round(buffer_gets/executions,1) lio, --> 10 round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11 round(cpu_time/executions/1000000,1) cpu_sec --> 12 from v$sqlarea s where s.module = ‘BatchTest’ ---> MODULE 명으로 검색 order by 7 desc ---> 전체 I/O 처리량이 높은 순으로 정렬 ) t1 where rownum <= 50 ;
  • 6. 44│2013 기술백서 White Paper MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS ------------- --------------------------------------- ---------- ----------- BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206 BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014 BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901 SQL TEXT로 식별할 수 있는 경우 앞에서 PLSQL_BATCH_1, PLSQL_BATCH_2 을 생성할 때, 아래와 같이 개별 SQL 에 식별자를 추가하였다. delete /*+ BatchTest_plsql_batch_1 */ … insert /*+ BatchTest_plsql_batch_2 */ … update /*+ BatchTest_plsql_batch_2 */ … 배치 프로그램의 모든 SQL 에 식별자를 추가했으므로, 아래와 같이 배치 프로그램의 모든 SQL 에 대한 수행정보를 조회할 수 있다. select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets from ( select parsing_schema_name Schema, --> 1 module, --> 2 sql_id, --> 3 hash_value, --> 4 substr(sql_text,1,37) substr_sqltext, --> 5 executions, --> 6 buffer_gets, --> 7 disk_reads, --> 8 rows_processed, --> 9 round(buffer_gets/executions,1) lio, --> 10 round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11 round(cpu_time/executions/1000000,1) cpu_sec --> 12 from v$sqlarea s where s.sql_fulltext like ‘%BatchTest_plsql_batch%’ ---> SQL TEXT 로 검색 order by 7 desc ) t1 where rownum <= 50 ; MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS ------------- --------------------------------------- ---------- -----------
  • 7. Part 1 ORACLE │45 BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206 BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014 BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901 MODULE명 또는 SQL에 식별자가 없는 경우 앞에서 PLSQL_BATCH_1, PLSQL_BATCH_2 프로시저 생성 시 MODULE 명 설정이나 SQL 에 식별자를 추가하지 않았다면, 어떻게 튜닝대상을 추출할 수 있을까? 이런 경우 Oracle 이 제공 하는 X$KGLRD 테이블과 DBA_OBJECTS.OBJECTID 와 V$SQL.PROGRAM_ID 으로 배치 프 로그램에서 튜닝대상 SQL 을 추출할 수 있다. Note. Oracle 버전이 10g 이전까지는 X$KGLRD 를 활용하여 추출해야 한다. 왜냐하면, 10g 이후 버전에 V$SQL 나 V$SQLAREA 에 PROGRAM_ID 가 추가되었기 때문이다. X$KGLRD 활용하기 아래에 X$KGLRD 의 칼럼 정보와 테스트 예제를 통해 사용방법을 알아보도록 하자. x$kglrd 칼럼 구성 - Oracle Version: 11.2.0.3 에서 추출 Column Name DataType ----------------------- --------------- ADDR RAW(4) INDX NUMBER INST_ID NUMBER KGLHDCDR RAW(4) KGLNAOWN VARCHAR2(64) KGLNACNM VARCHAR2(512) -----> Procedure & Function Name KGLNACNL NUMBER KGLNACHV NUMBER KGLHDPDR RAW(4) KGLDEPNO NUMBER KGLRDHDL RAW(4) KGLNADNM VARCHAR2(512) -----> SQL Text KGLNADNL NUMBER KGLNADHV NUMBER -----> SQL Hash Value
  • 8. 46│2013 기술백서 White Paper KGLRDFLG NUMBER Oracle 이 제공하는 X$KGLRD 은 SQL 의 수행정보를 담고 있는데, 특정 PROCEDURE 나 FUNCTION 내에서 수행되는 SQL 에 대해 오브젝트명과 함께 확인할 수 있기 때문에, 특정 배치 프로그램에서 수행되는 모든 SQL 을 추출하고자 할 때 유용하다. Procedure/Function 명으로 조회하기 PROCEDURE 나 FUNCTION 명은 대문자로 입력되어 있으므로 조회 시 유의하자. X$KGLRD 에서 PROCEDURE 나 FUNCTION 명으로 조회할 경우에 PLSQL_BATCH_2 프로시저에서 호출 하는 PLSQL_BATCH_1 도 같이 조회해야 전체 SQL 을 추출할 수 있다. col kglnacnm for a15 col kglnadnm for a37 set pagesize 100 select kglnacnm, substr(kglnadnm,1,37) kglnadnm, kglnadhv from x$kglrd where kglnacnm in ('PLSQL_BATCH_2', 'PLSQL_BATCH_1') ; KGLNACNM KGLNADNM KGLNADHV --------------- ------------------------------------- ---------- PLSQL_BATCH_2 UPDATE /*+ BatchTest_plsql_batch_2 */ 3943223768 PLSQL_BATCH_2 COMMIT 255718823 PLSQL_BATCH_2 INSERT /*+ BatchTest_plsql_batch_2 */ 111618107 PLSQL_BATCH_1 COMMIT 255718823 PLSQL_BATCH_1 DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916 SQL 을 SQL Text 로 조회하기 SQL Text 로 X$KGLRD 에서 조회할 경우에는 아래와 같이 수행하면 된다. select distinct substr(kglnadnm,1,37) kglnadnm, kglnadhv from x$kglrd where kglnadnm like '%BatchTest_plsql_batch%'; KGLNADNM KGLNADHV
  • 9. Part 1 ORACLE │47 ------------------------------------- ---------- UPDATE /*+ BatchTest_plsql_batch_2 */ 3943223768 DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916 INSERT /*+ BatchTest_plsql_batch_2 */ 111618107 SQL 을 Hash Value 로 조회하기 DB 서버를 모니터링 시 Hash_Value 를 알고 있을 때, 만약 해당 SQL 이 배치 프로그램에서 수 행되는 경우에 어떤 프로그램에서 수행된 것인지 찾아야 할 때 아래와 같이 Hash_Value 로 X$KGLRD 에서 조회하면 확인할 수 있다. select distinct substr(kglnadnm,1,37) kglnadnm, kglnadhv from x$kglrd where kglnadhv = 3094796916 ; KGLNADNM KGLNADHV ------------------------------------- ---------- DELETE /*+ BatchTest_plsql_batch_1 */ 3094796916 튜닝대상 추출하기 X$KGLRD 을 활용하여 배치 프로그램에서 수행된 SQL 을 추출 후, 아래와 같이 각 SQL 의 수 행정보를 분석 후 튜닝대상을 추출하면 된다. select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets from ( select parsing_schema_name Schema, --> 1 module, --> 2 sql_id, --> 3 hash_value, --> 4 substr(sql_text,1,37) substr_sqltext, --> 5 executions, --> 6 buffer_gets, --> 7 disk_reads, --> 8 rows_processed, --> 9 round(buffer_gets/executions,1) lio, --> 10 round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11 round(cpu_time/executions/1000000,1) cpu_sec --> 12 from v$sqlarea s
  • 10. 48│2013 기술백서 White Paper where s.hash_value in (3943223768, 3094796916, 111618107) order by 7 desc ) t1 where rownum <= 50 ; MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS ------------- --------------------------------------- ---------- ----------- BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206 BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014 BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901 DBA_OBJECTS & V$SQLAREA 활용하기 Oracle 버전이 10g 이후부터 V$SQL 과 V$SQLAREA 에 PROGRAM_ID 칼럼이 추가되었다. PROGRAM_ID 칼럼은 DBA_OBJECTS 의 OBJECT_ID 칼럼과 연결이 된다. 그러므로 PROCEDURE 나 FUNCTION 으로 작성된 배치 프로그램의 경우, DBA_OBJECTS 와 V$SQL [V$SQLAREA]을 통해 튜닝대상 SQL 을 추출할 수 있다. 먼저 배치 프로그램 명으로 OBJECT_ID 를 추출한다. select object_name, object_id from dba_objects where object_name IN ('PLSQL_BATCH_1','PLSQL_BATCH_2') ; OBJECT_NAME OBJECT_ID -------------------- ---------- PLSQL_BATCH_1 61738 PLSQL_BATCH_2 61739 DBA_OBJECTS 에서 추출된 OBJECT_ID 값으로 V$SQLAREA 의 PROGRAM_ID 와 연결하여 조회하면 아래와 같이 SQL 을 추출할 수 있다. col substr_text for a30 col module for a15 select substr(sql_text,1,30) substr_text, module, program_id from v$sqlarea where program_id in (61738, 61739) ;
  • 11. Part 1 ORACLE │49 SUBSTR_TEXT MODULE PROGRAM_ID ------------------------------ --------------- ---------- UPDATE /*+ BatchTest_plsql_bat BatchTest 61739 DELETE /*+ BatchTest_plsql_bat BatchTest 61738 INSERT /*+ BatchTest_plsql_bat BatchTest 61739 앞에서 DBA_OBJECTS 와 V$SQLAREA 를 활용하여, 해당 배치 프로그램에서 수행한 모든 SQL 에 대한 수행정보를 아래와 같이 조회할 수 있다. 그리고 조회된 정보를 면밀히 분석하면 배치 프로그램의 SQL 중 튜닝대상을 추출하는 것은 그리 어렵지 않을 것이다. select t1.module, t1.substr_sqltext, t1.executions, t1.buffer_gets from ( select parsing_schema_name Schema, --> 1 module, --> 2 sql_id, --> 3 hash_value, --> 4 substr(sql_text,1,37) substr_sqltext, --> 5 executions, --> 6 buffer_gets, --> 7 disk_reads, --> 8 rows_processed, --> 9 round(buffer_gets/executions,1) lio, --> 10 round(elapsed_time/executions/1000000,1) elapsed_sec, --> 11 round(cpu_time/executions/1000000,1) cpu_sec --> 12 from v$sqlarea s where s.program_id in ( select object_id from dba_objects where object_name in ( 'PLSQL_BATCH_1', 'PLSQL_BATCH_2') ) order by 7 desc ) t1 where rownum <= 50 ; MODULE SUBSTR_SQLTEXT EXECUTIONS BUFFER_GETS ------------- --------------------------------------- ---------- ----------- BatchTest DELETE /*+ BatchTest_plsql_batch_1 */ 1 159206 BatchTest UPDATE /*+ BatchTest_plsql_batch_2 */ 1 105014 BatchTest INSERT /*+ BatchTest_plsql_batch_2 */ 1 10901