SlideShare a Scribd company logo
1 of 9
Download to read offline
Part 1 ORACLE │193
TABLE ACCESS 패턴을 이용한 SQL 튜닝
㈜엑셈 컨설팅본부/DB컨설팅팀 오 경렬
본 문서는 필자가 사용하는 TABLE ACCESS 패턴을 확인하는 스크립트에 대한 내용입니다.
필자가 SQL 튜닝을 진행하면서 애용하는 스크립트입니다.
본 스크립트를 사용하는 경우는 크게 2 가지가 있습니다.
1. 인덱스 생성 가이드를 하는 경우
2. 테이블 단위로 튜닝을 진행하는 경우
1. 인덱스 생성 가이드를 하는경우
SQL 튜닝을 하다 보면 인덱스 생성 가이드 해야 하는 경우가 있습니다. UNIQUE 한 성격의 칼
럼 이라면 별다른 고민 없이 생성 권고가 가능하겠지만 복잡한 업무 패턴을 가지고 있거나 다른
쿼리 플랜에 영향을 줄 수 있는 경우는 상당히 신중하게 작업을 진행해야 합니다.
인덱스를 생성하려는 테이블을 참조하는 모든 쿼리를 확인하면 좋겠지만 우리에게 주어진 시간
은 한정적입니다. 컨설팅의 질 만큼 양도 중요하기 때문에 짧은 시간에 최대한 많은 정보를 확인
할 필요가 있습니다. 필자는 엑셀 메크로를 활용해 가독성을 높입니다. 스크립트는 가독성을 높
이면서 필요한 정보를 최대한 많이 보여 주도록 작성했습니다.
▶ 스크립트
스크립트는 다음과 같은 기능을 갖습니다.
1. Access Predicate / Filter Predicate 확인
2. HASH JOIN 에 사용된 칼럼 표시
3. 일량/수행횟수/모듈명 등 쿼리 수행 이력 확인
4. 리터럴 쿼리를 하나로 합치고 리터럴 쿼리의 갯수를 확인
5. 리터럴 쿼리의 경우 가장 많은 비효율을 차지하는 대표 쿼리의 SQL_ID 표시
194│2013 기술백서 White Paper
▶ 엑셀 메크로 활용
수행 결과 -> HTML -> 엑셀
가독성을 위해 엑셀 메크로를 활용해 특정 문자에 색칠 하는데
이때 옮기는 HTML 을 이용해야 (LITE PLUS 에서는) SQL_TEXT 가 한 샐안에 들어갑니다.
엑셀 메크로는 반 자동화 하여 사용합니다.
▶ 엑셀 메크로 적용
Step by Step 으로 적겠습니다. 엑셀에 붙여넣기 한 후에 ALT+F11 Click
<1> 더블 클릭
<2> 더블 클릭 후 창이 뜨면 아래 소스를 붙여 넣습니다.
fstr -> 하이라이트 할 문자
Font.ColorIndex -> 하이라이트 색
Sub strcolor_1()
Dim orng As Range
Dim t, y As Integer
Dim fstr1 As String
Dim fstr2 As String
Part 1 ORACLE │195
fstr1 = "PROC_CODE"
fstr2 = "LINE_CODE"
Set orng = Selection
For t = 1 To orng.Rows.Count
For y = 1 To orng.Columns.Count
If InStr(orng.Cells(t, y), fstr1) <> 0 Then
orng.Cells(t, y).Characters(Start:=InStr(orng.Cells(t, y), fstr1),
Length:=Len(fstr1)).Font.ColorIndex = 3
End If
If InStr(orng.Cells(t, y), fstr2) <> 0 Then
orng.Cells(t, y).Characters(Start:=InStr(orng.Cells(t, y), fstr2),
Length:=Len(fstr2)).Font.ColorIndex = 4
End If
Next
Next
End Sub
<3> 셀 선택 후 매크로 적용
196│2013 기술백서 White Paper
<4> 결과
2. 테이블 단위로 튜닝을 진행하는 경우
튜닝 포인트를 발췌하는 것도 컨설턴트가 갖춰야 할 중요한 역량입니다. 테이블 크기 / 테이블
Description 등을 확인 한 뒤 BIG 테이블 위주로 TABLE ACCESS 패턴을 확인하면서 비효율이
발생하는 쿼리를 확인하는 방법은 CASE BY CASE 지만 매우 강력한 무기로 작용할 수 있습니
다.
▶ SCRIPT
WITH w_sql_list AS (SELECT DISTINCT sql_id ,
inst_id
FROM gv$sql_plan p
WHERE 1=1
AND object_name IN (SELECT UPPER( :tname )
FROM dual
UNION ALL
SELECT index_name
FROM dba_indexes
WHERE table_name = UPPER( :tname ) ) ) ,
w_sql_face AS (SELECT /*+ leading(sp) use_hash(sa) */
Part 1 ORACLE │197
sa.inst_id ,
sa.sql_id ,
sa.version_count ,
sa.executions ,
sa.first_load_time ,
sa.disk_reads ,
sa.direct_writes ,
sa.buffer_gets ,
sa.rows_processed ,
sa.optimizer_cost ,
sa.parsing_schema_name ,
sa.hash_value ,
sa.plan_hash_value ,
sa.module ,
sa.cpu_time ,
sa.elapsed_time ,
sa.last_load_time ,
RANK( ) over( PARTITION BY sa.inst_id , sa.plan_hash_value
ORDER BY buffer_gets DESC ) rk
FROM gv$sqlarea sa ,
w_sql_list sp
WHERE 1=1
AND sa.sql_id = sp.sql_id
AND sa.inst_id = sp.inst_id
AND MODULE NOT LIKE 'TOAD%'
AND MODULE NOT LIKE 'MAX%'
AND MODULE NOT LIKE 'Toad%'
AND MODULE NOT LIKE 'Lite%'
AND MODULE NOT LIKE 'LINESTOP%'
AND MODULE NOT LIKE 'Golden%'
AND MODULE NOT LIKE 'Golden%'
AND MODULE NOT LIKE 'Orange%'
AND parsing_schema_name LIKE 'GMES20%' ) ,
w_sql_pt AS (SELECT /*+ use_hash(p x) */
p.inst_id ,
p.sql_id ,
p.plan_hash_value ,
p.object_name ||' ' ||p.operation ||' ' ||p.options AS operation ,
p.object_type ,
p.id ,
p.parent_id ,
198│2013 기술백서 White Paper
p.depth ,
p.access_predicates ,
p.filter_predicates ,
p.child_number
FROM gv$sql_plan p ,
(SELECT /*+ no_merge use_hash(p f) */
p.inst_id ,
p.plan_hash_value ,
p.operation ,
p.options ,
p.object_name ,
p.object_type ,
p.id ,
p.parent_id ,
p.depth ,
p.access_predicates ,
p.filter_predicates ,
p.sql_id
FROM gv$sql_plan p ,
w_sql_face f
WHERE 1=1
AND f.rk = 1
AND f.sql_id = p.sql_id
AND object_name IN (SELECT UPPER( :tname )
FROM dual
UNION ALL
SELECT index_name
FROM dba_indexes
WHERE table_name = UPPER( :tname ) ) ) x
WHERE x.inst_id = p.inst_id
AND x.parent_id = p.id
AND p.sql_id = x.sql_id
AND p.plan_hash_value = x.plan_hash_value
AND p.operation = 'HASH JOIN'
UNION ALL
SELECT /*+ use_hash(p f)*/
p.inst_id ,
p.sql_id ,
p.plan_hash_value ,
p.object_name ||' ' ||p.operation ||' ' ||p.options AS operation ,
p.object_type ,
Part 1 ORACLE │199
p.id ,
p.parent_id ,
p.depth ,
p.access_predicates ,
p.filter_predicates ,
p.child_number
FROM gv$sql_plan p ,
w_sql_face f
WHERE 1=1
AND f.rk = 1
AND f.sql_id = p.sql_id
AND object_name IN (SELECT :tname
FROM dual
UNION ALL
SELECT index_name
FROM dba_indexes
WHERE table_name = :tname ) )
SELECT decode( seq# , 1 , decode( inst_cnt , 2 , 3 , 1 , inst_id ) ) inst_id ,
decode( seq# , 1 , MODULE ) MODULE ,
decode( seq# , 1 , (SELECT KGLFNOBJ
FROM sys.XM$KGLCURSOR_CHILD x
WHERE x.kglobt03 = a.sql_id
AND ROWNUM <= 1 ) ) text ,
decode( seq# , 1 , sql_id ) sql_id ,
decode( seq# , 1 , liter_cnt ) liter_cnt ,
decode( seq# , 1 , plan_hash_value ) plan_hash_value ,
decode( seq# , 1 , parsing_schema_name ) parsing_schema_name ,
decode( seq# , 1 , executions ) exec_t ,
decode( seq# , 1 , face_exec ) fa_exec ,
decode( seq# , 1 , buffer_gets ) bg ,
decode( seq# , 1 , face_bgets ) fa_bg ,
decode( seq# , 1 , ROUND(( buffer_gets ) /decode(( executions ) , 0 , 1 ,
( executions ) ) , 0 ) ) bg_1 ,
decode( seq# , 1 , ROUND(( disk_reads ) /decode(( executions ) , 0 , 1 ,
( executions ) ) , 2 ) ) dr_1 ,
decode( seq# , 1 , ROUND(( rows_processed ) /decode(( executions ) , 0 , 1 ,
( executions ) ) , 0 ) ) row_1 ,
decode( seq# , 1 , ROUND((( elapsed_time ) /decode(( executions ) , 0 , 1 ,
( executions ) ) ) /1000000 , 3 ) ) elapst_1 ,
decode( seq# , 1 , ROUND((( cpu_time ) /decode(( executions ) , 0 , 1 ,
( executions ) ) ) /1000000 , 3 ) ) cput_1 ,
200│2013 기술백서 White Paper
id ,
parent_id ,
seq# ,
operation ,
filter_predicates ,
access_predicates
FROM (SELECT a.* ,
RANK( ) over (
ORDER BY buffer_gets DESC, sql_id, plan_hash_value) bg_seq#
FROM (SELECT /*+ leading(p) use_hash(p f s) */
ROW_NUMBER( ) over( PARTITION BY x.sql_id, x.plan_hash_value
ORDER BY x.id ) seq# ,
x.*
FROM (SELECT p.id ,
p.parent_id ,
p.sql_id ,
p.plan_hash_value ,
SUM( s.liter_cnt ) liter_cnt ,
MAX( p.operation ) operation ,
MAX( p.filter_predicates ) filter_predicates ,
MAX( p.access_predicates ) access_predicates ,
MAX( f.module ) MODULE ,
MAX( f.parsing_schema_name ) parsing_schema_name ,
MAX( s.executions ) executions ,
MAX( f.executions ) face_exec ,
MAX( s.buffer_gets ) buffer_gets ,
MAX( f.buffer_gets ) face_bgets ,
MAX( s.disk_reads ) disk_reads ,
MAX( s.rows_processed ) rows_processed ,
MAX( s.elapsed_time ) elapsed_time ,
MAX( s.cpu_time ) cpu_time ,
MAX( f.inst_id ) inst_id ,
MAX( DISTINCT f.inst_id ) inst_cnt
FROM w_sql_pt p ,
w_sql_face f ,
( --같은 Plan_Hash_value 를 같는 쿼리의 일량을 모두 합침
SELECT inst_id ,
COUNT( DISTINCT sql_id ) liter_cnt ,
MAX( version_count ) version_count ,
SUM( executions ) executions ,
MIN( first_load_time ) first_load_time ,
Part 1 ORACLE │201
SUM( disk_reads ) disk_reads ,
SUM( direct_writes ) direct_writes ,
SUM( buffer_gets ) buffer_gets ,
SUM( rows_processed ) rows_processed ,
AVG( optimizer_cost ) optimizer_cost ,
MAX( parsing_schema_name ) parsing_schema_name ,
MAX( hash_value ) hash_value ,
plan_hash_value ,
MAX( MODULE ) MODULE ,
SUM( cpu_time ) cpu_time ,
SUM( elapsed_time ) elapsed_time ,
MAX( last_load_time ) last_load_time
FROM w_sql_face
WHERE 1=1
GROUP BY inst_id ,
plan_hash_value ) s
WHERE f.rk = 1
AND f.plan_hash_value = s.plan_hash_value
AND f.inst_id = s.inst_id
AND f.sql_id = p.sql_id
AND f.inst_id = p.inst_id
GROUP BY p.id ,
p.sql_id ,
p.parent_id ,
p.plan_hash_value ) x ) a ) a
ORDER BY bg_seq# ,
seq# ;

More Related Content

What's hot

Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Jiho Lee
 
KEEP BUFFER 활용 방안_Wh oracle
KEEP BUFFER 활용 방안_Wh oracleKEEP BUFFER 활용 방안_Wh oracle
KEEP BUFFER 활용 방안_Wh oracle엑셈
 
PostgreSql vaccum
PostgreSql vaccumPostgreSql vaccum
PostgreSql vaccum승범 현
 
#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분거리)
 
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기PgDay.Seoul
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 
[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock[2015 05-29] Oracle Lock
[2015 05-29] Oracle LockSeok-joon Yun
 
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracleSQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle엑셈
 
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자PgDay.Seoul
 
SQL Profile을 이용한 SQL Plan 변경_Wh oracle
SQL Profile을 이용한 SQL Plan 변경_Wh oracleSQL Profile을 이용한 SQL Plan 변경_Wh oracle
SQL Profile을 이용한 SQL Plan 변경_Wh oracle엑셈
 
BlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracleBlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracle엑셈
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter엑셈
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle엑셈
 
Result Cache 동작원리 및 활용방안_Wh oracle
Result Cache 동작원리 및 활용방안_Wh oracleResult Cache 동작원리 및 활용방안_Wh oracle
Result Cache 동작원리 및 활용방안_Wh oracle엑셈
 
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracleWINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracle엑셈
 
[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2Seok-joon Yun
 
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracleORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle엑셈
 

What's hot (20)

Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
Pg 클러스터 기반의 구성 및 이전, 그리고 인덱스 클러스터링
 
KEEP BUFFER 활용 방안_Wh oracle
KEEP BUFFER 활용 방안_Wh oracleKEEP BUFFER 활용 방안_Wh oracle
KEEP BUFFER 활용 방안_Wh oracle
 
PostgreSql vaccum
PostgreSql vaccumPostgreSql vaccum
PostgreSql vaccum
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기
[Pgday.Seoul 2017] 8. PostgreSQL 10 새기능 소개 - 김상기
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock
 
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracleSQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
SQL 튜닝에 Dictionary View 활용하기 Part2_Wh oracle
 
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
 
SQL Profile을 이용한 SQL Plan 변경_Wh oracle
SQL Profile을 이용한 SQL Plan 변경_Wh oracleSQL Profile을 이용한 SQL Plan 변경_Wh oracle
SQL Profile을 이용한 SQL Plan 변경_Wh oracle
 
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
 
BlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracleBlOOM FILTER의 이해와 활용방법_Wh oracle
BlOOM FILTER의 이해와 활용방법_Wh oracle
 
1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace1.7 튜닝의도구 sql autorace
1.7 튜닝의도구 sql autorace
 
Oracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameterOracle Query Optimizer 관련 Parameter_OracleParameter
Oracle Query Optimizer 관련 Parameter_OracleParameter
 
(오라클SQL강좌)오라클 NLS 파라미터_NLS_DATE_FORMAT, NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY...
(오라클SQL강좌)오라클 NLS 파라미터_NLS_DATE_FORMAT, NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY...(오라클SQL강좌)오라클 NLS 파라미터_NLS_DATE_FORMAT, NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY...
(오라클SQL강좌)오라클 NLS 파라미터_NLS_DATE_FORMAT, NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY...
 
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
배치 프로그램에서 튜닝대상 SQL 추출하기_Wh oracle
 
Result Cache 동작원리 및 활용방안_Wh oracle
Result Cache 동작원리 및 활용방안_Wh oracleResult Cache 동작원리 및 활용방안_Wh oracle
Result Cache 동작원리 및 활용방안_Wh oracle
 
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracleWINDOW FUNCTION의 이해와 활용방법_Wh oracle
WINDOW FUNCTION의 이해와 활용방법_Wh oracle
 
[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2
 
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracleORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
ORACLE EXADATA HCC 압축방식 이해하기_Wh oracle
 

Viewers also liked

Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)중선 곽
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)중선 곽
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문중선 곽
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해중선 곽
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm엑셈
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm엑셈
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm엑셈
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle엑셈
 
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엑셈
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm엑셈
 
네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm엑셈
 
스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm엑셈
 
SQL PlAN MANAGEMENT 활용_Wh oracle
SQL PlAN MANAGEMENT 활용_Wh oracleSQL PlAN MANAGEMENT 활용_Wh oracle
SQL PlAN MANAGEMENT 활용_Wh oracle엑셈
 
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracleSPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle엑셈
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_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엑셈
 

Viewers also liked (18)

Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm
 
NLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracleNLJ BATCH와 부분범위 처리_Wh oracle
NLJ BATCH와 부분범위 처리_Wh oracle
 
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
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm
 
네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm네트워크 기반 통신 및 계층 구조_Wh apm
네트워크 기반 통신 및 계층 구조_Wh apm
 
스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm스위치의 분류 및 역할_Wh apm
스위치의 분류 및 역할_Wh apm
 
SQL PlAN MANAGEMENT 활용_Wh oracle
SQL PlAN MANAGEMENT 활용_Wh oracleSQL PlAN MANAGEMENT 활용_Wh oracle
SQL PlAN MANAGEMENT 활용_Wh oracle
 
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracleSPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle
SPA(SQL Performance Analyze)를 이용한 통계 정보 수집_Wh oracle
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_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
 

Similar to TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle

KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH, 케이티하이텔
 
스플렁크 머신러닝 연동
스플렁크 머신러닝 연동스플렁크 머신러닝 연동
스플렁크 머신러닝 연동Seung-Woo Kang
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning IntegrationTIMEGATE
 
하둡 타입과 포맷
하둡 타입과 포맷하둡 타입과 포맷
하둡 타입과 포맷진호 박
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1happychallenge
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxhanbeom Park
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Elasticsearch
 
ffmpeg optimization using CUDA
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDAyyooooon
 
C Language I
C Language IC Language I
C Language ISuho Kwon
 
Programming Cascading
Programming CascadingProgramming Cascading
Programming CascadingTaewook Eom
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQLI Goo Lee
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국hanbeom Park
 
효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차희동 강
 
sqlserver7.0 데이타베이스
sqlserver7.0 데이타베이스sqlserver7.0 데이타베이스
sqlserver7.0 데이타베이스영빈 송
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)SeongHyun Ahn
 
PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초Jiho Lee
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)Tae Young Lee
 

Similar to TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle (20)

KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
 
스플렁크 머신러닝 연동
스플렁크 머신러닝 연동스플렁크 머신러닝 연동
스플렁크 머신러닝 연동
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration
 
하둡 타입과 포맷
하둡 타입과 포맷하둡 타입과 포맷
하둡 타입과 포맷
 
R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1R 프로그램의 이해와 활용 v1.1
R 프로그램의 이해와 활용 v1.1
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptx
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
 
ffmpeg optimization using CUDA
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDA
 
C Language I
C Language IC Language I
C Language I
 
Programming Cascading
Programming CascadingProgramming Cascading
Programming Cascading
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국
 
효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차
 
sqlserver7.0 데이타베이스
sqlserver7.0 데이타베이스sqlserver7.0 데이타베이스
sqlserver7.0 데이타베이스
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초PostgreSQL로 배우는 SQL 기초
PostgreSQL로 배우는 SQL 기초
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 

More from 엑셈

WAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apmWAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apm엑셈
 
SSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracleSSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracle엑셈
 
대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle엑셈
 
Commit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracleCommit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracle엑셈
 
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracleBind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle엑셈
 
System Capa Planning_DBA oracle edu
System Capa Planning_DBA oracle eduSystem Capa Planning_DBA oracle edu
System Capa Planning_DBA oracle edu엑셈
 
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case studyTX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study엑셈
 

More from 엑셈 (7)

WAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apmWAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apm
 
SSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracleSSD 개념 및 활용_Wh oracle
SSD 개념 및 활용_Wh oracle
 
대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle대량의 DML 작업에 대한 성능개선방안_Wh oracle
대량의 DML 작업에 대한 성능개선방안_Wh oracle
 
Commit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracleCommit Wait Class 대기시간 감소 방안_Wh oracle
Commit Wait Class 대기시간 감소 방안_Wh oracle
 
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracleBind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
 
System Capa Planning_DBA oracle edu
System Capa Planning_DBA oracle eduSystem Capa Planning_DBA oracle edu
System Capa Planning_DBA oracle edu
 
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case studyTX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study
TX락 경험에 의한 시스템 성능 저하 분석 사례_Maxgauge case study
 

TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle

  • 1. Part 1 ORACLE │193 TABLE ACCESS 패턴을 이용한 SQL 튜닝 ㈜엑셈 컨설팅본부/DB컨설팅팀 오 경렬 본 문서는 필자가 사용하는 TABLE ACCESS 패턴을 확인하는 스크립트에 대한 내용입니다. 필자가 SQL 튜닝을 진행하면서 애용하는 스크립트입니다. 본 스크립트를 사용하는 경우는 크게 2 가지가 있습니다. 1. 인덱스 생성 가이드를 하는 경우 2. 테이블 단위로 튜닝을 진행하는 경우 1. 인덱스 생성 가이드를 하는경우 SQL 튜닝을 하다 보면 인덱스 생성 가이드 해야 하는 경우가 있습니다. UNIQUE 한 성격의 칼 럼 이라면 별다른 고민 없이 생성 권고가 가능하겠지만 복잡한 업무 패턴을 가지고 있거나 다른 쿼리 플랜에 영향을 줄 수 있는 경우는 상당히 신중하게 작업을 진행해야 합니다. 인덱스를 생성하려는 테이블을 참조하는 모든 쿼리를 확인하면 좋겠지만 우리에게 주어진 시간 은 한정적입니다. 컨설팅의 질 만큼 양도 중요하기 때문에 짧은 시간에 최대한 많은 정보를 확인 할 필요가 있습니다. 필자는 엑셀 메크로를 활용해 가독성을 높입니다. 스크립트는 가독성을 높 이면서 필요한 정보를 최대한 많이 보여 주도록 작성했습니다. ▶ 스크립트 스크립트는 다음과 같은 기능을 갖습니다. 1. Access Predicate / Filter Predicate 확인 2. HASH JOIN 에 사용된 칼럼 표시 3. 일량/수행횟수/모듈명 등 쿼리 수행 이력 확인 4. 리터럴 쿼리를 하나로 합치고 리터럴 쿼리의 갯수를 확인 5. 리터럴 쿼리의 경우 가장 많은 비효율을 차지하는 대표 쿼리의 SQL_ID 표시
  • 2. 194│2013 기술백서 White Paper ▶ 엑셀 메크로 활용 수행 결과 -> HTML -> 엑셀 가독성을 위해 엑셀 메크로를 활용해 특정 문자에 색칠 하는데 이때 옮기는 HTML 을 이용해야 (LITE PLUS 에서는) SQL_TEXT 가 한 샐안에 들어갑니다. 엑셀 메크로는 반 자동화 하여 사용합니다. ▶ 엑셀 메크로 적용 Step by Step 으로 적겠습니다. 엑셀에 붙여넣기 한 후에 ALT+F11 Click <1> 더블 클릭 <2> 더블 클릭 후 창이 뜨면 아래 소스를 붙여 넣습니다. fstr -> 하이라이트 할 문자 Font.ColorIndex -> 하이라이트 색 Sub strcolor_1() Dim orng As Range Dim t, y As Integer Dim fstr1 As String Dim fstr2 As String
  • 3. Part 1 ORACLE │195 fstr1 = "PROC_CODE" fstr2 = "LINE_CODE" Set orng = Selection For t = 1 To orng.Rows.Count For y = 1 To orng.Columns.Count If InStr(orng.Cells(t, y), fstr1) <> 0 Then orng.Cells(t, y).Characters(Start:=InStr(orng.Cells(t, y), fstr1), Length:=Len(fstr1)).Font.ColorIndex = 3 End If If InStr(orng.Cells(t, y), fstr2) <> 0 Then orng.Cells(t, y).Characters(Start:=InStr(orng.Cells(t, y), fstr2), Length:=Len(fstr2)).Font.ColorIndex = 4 End If Next Next End Sub <3> 셀 선택 후 매크로 적용
  • 4. 196│2013 기술백서 White Paper <4> 결과 2. 테이블 단위로 튜닝을 진행하는 경우 튜닝 포인트를 발췌하는 것도 컨설턴트가 갖춰야 할 중요한 역량입니다. 테이블 크기 / 테이블 Description 등을 확인 한 뒤 BIG 테이블 위주로 TABLE ACCESS 패턴을 확인하면서 비효율이 발생하는 쿼리를 확인하는 방법은 CASE BY CASE 지만 매우 강력한 무기로 작용할 수 있습니 다. ▶ SCRIPT WITH w_sql_list AS (SELECT DISTINCT sql_id , inst_id FROM gv$sql_plan p WHERE 1=1 AND object_name IN (SELECT UPPER( :tname ) FROM dual UNION ALL SELECT index_name FROM dba_indexes WHERE table_name = UPPER( :tname ) ) ) , w_sql_face AS (SELECT /*+ leading(sp) use_hash(sa) */
  • 5. Part 1 ORACLE │197 sa.inst_id , sa.sql_id , sa.version_count , sa.executions , sa.first_load_time , sa.disk_reads , sa.direct_writes , sa.buffer_gets , sa.rows_processed , sa.optimizer_cost , sa.parsing_schema_name , sa.hash_value , sa.plan_hash_value , sa.module , sa.cpu_time , sa.elapsed_time , sa.last_load_time , RANK( ) over( PARTITION BY sa.inst_id , sa.plan_hash_value ORDER BY buffer_gets DESC ) rk FROM gv$sqlarea sa , w_sql_list sp WHERE 1=1 AND sa.sql_id = sp.sql_id AND sa.inst_id = sp.inst_id AND MODULE NOT LIKE 'TOAD%' AND MODULE NOT LIKE 'MAX%' AND MODULE NOT LIKE 'Toad%' AND MODULE NOT LIKE 'Lite%' AND MODULE NOT LIKE 'LINESTOP%' AND MODULE NOT LIKE 'Golden%' AND MODULE NOT LIKE 'Golden%' AND MODULE NOT LIKE 'Orange%' AND parsing_schema_name LIKE 'GMES20%' ) , w_sql_pt AS (SELECT /*+ use_hash(p x) */ p.inst_id , p.sql_id , p.plan_hash_value , p.object_name ||' ' ||p.operation ||' ' ||p.options AS operation , p.object_type , p.id , p.parent_id ,
  • 6. 198│2013 기술백서 White Paper p.depth , p.access_predicates , p.filter_predicates , p.child_number FROM gv$sql_plan p , (SELECT /*+ no_merge use_hash(p f) */ p.inst_id , p.plan_hash_value , p.operation , p.options , p.object_name , p.object_type , p.id , p.parent_id , p.depth , p.access_predicates , p.filter_predicates , p.sql_id FROM gv$sql_plan p , w_sql_face f WHERE 1=1 AND f.rk = 1 AND f.sql_id = p.sql_id AND object_name IN (SELECT UPPER( :tname ) FROM dual UNION ALL SELECT index_name FROM dba_indexes WHERE table_name = UPPER( :tname ) ) ) x WHERE x.inst_id = p.inst_id AND x.parent_id = p.id AND p.sql_id = x.sql_id AND p.plan_hash_value = x.plan_hash_value AND p.operation = 'HASH JOIN' UNION ALL SELECT /*+ use_hash(p f)*/ p.inst_id , p.sql_id , p.plan_hash_value , p.object_name ||' ' ||p.operation ||' ' ||p.options AS operation , p.object_type ,
  • 7. Part 1 ORACLE │199 p.id , p.parent_id , p.depth , p.access_predicates , p.filter_predicates , p.child_number FROM gv$sql_plan p , w_sql_face f WHERE 1=1 AND f.rk = 1 AND f.sql_id = p.sql_id AND object_name IN (SELECT :tname FROM dual UNION ALL SELECT index_name FROM dba_indexes WHERE table_name = :tname ) ) SELECT decode( seq# , 1 , decode( inst_cnt , 2 , 3 , 1 , inst_id ) ) inst_id , decode( seq# , 1 , MODULE ) MODULE , decode( seq# , 1 , (SELECT KGLFNOBJ FROM sys.XM$KGLCURSOR_CHILD x WHERE x.kglobt03 = a.sql_id AND ROWNUM <= 1 ) ) text , decode( seq# , 1 , sql_id ) sql_id , decode( seq# , 1 , liter_cnt ) liter_cnt , decode( seq# , 1 , plan_hash_value ) plan_hash_value , decode( seq# , 1 , parsing_schema_name ) parsing_schema_name , decode( seq# , 1 , executions ) exec_t , decode( seq# , 1 , face_exec ) fa_exec , decode( seq# , 1 , buffer_gets ) bg , decode( seq# , 1 , face_bgets ) fa_bg , decode( seq# , 1 , ROUND(( buffer_gets ) /decode(( executions ) , 0 , 1 , ( executions ) ) , 0 ) ) bg_1 , decode( seq# , 1 , ROUND(( disk_reads ) /decode(( executions ) , 0 , 1 , ( executions ) ) , 2 ) ) dr_1 , decode( seq# , 1 , ROUND(( rows_processed ) /decode(( executions ) , 0 , 1 , ( executions ) ) , 0 ) ) row_1 , decode( seq# , 1 , ROUND((( elapsed_time ) /decode(( executions ) , 0 , 1 , ( executions ) ) ) /1000000 , 3 ) ) elapst_1 , decode( seq# , 1 , ROUND((( cpu_time ) /decode(( executions ) , 0 , 1 , ( executions ) ) ) /1000000 , 3 ) ) cput_1 ,
  • 8. 200│2013 기술백서 White Paper id , parent_id , seq# , operation , filter_predicates , access_predicates FROM (SELECT a.* , RANK( ) over ( ORDER BY buffer_gets DESC, sql_id, plan_hash_value) bg_seq# FROM (SELECT /*+ leading(p) use_hash(p f s) */ ROW_NUMBER( ) over( PARTITION BY x.sql_id, x.plan_hash_value ORDER BY x.id ) seq# , x.* FROM (SELECT p.id , p.parent_id , p.sql_id , p.plan_hash_value , SUM( s.liter_cnt ) liter_cnt , MAX( p.operation ) operation , MAX( p.filter_predicates ) filter_predicates , MAX( p.access_predicates ) access_predicates , MAX( f.module ) MODULE , MAX( f.parsing_schema_name ) parsing_schema_name , MAX( s.executions ) executions , MAX( f.executions ) face_exec , MAX( s.buffer_gets ) buffer_gets , MAX( f.buffer_gets ) face_bgets , MAX( s.disk_reads ) disk_reads , MAX( s.rows_processed ) rows_processed , MAX( s.elapsed_time ) elapsed_time , MAX( s.cpu_time ) cpu_time , MAX( f.inst_id ) inst_id , MAX( DISTINCT f.inst_id ) inst_cnt FROM w_sql_pt p , w_sql_face f , ( --같은 Plan_Hash_value 를 같는 쿼리의 일량을 모두 합침 SELECT inst_id , COUNT( DISTINCT sql_id ) liter_cnt , MAX( version_count ) version_count , SUM( executions ) executions , MIN( first_load_time ) first_load_time ,
  • 9. Part 1 ORACLE │201 SUM( disk_reads ) disk_reads , SUM( direct_writes ) direct_writes , SUM( buffer_gets ) buffer_gets , SUM( rows_processed ) rows_processed , AVG( optimizer_cost ) optimizer_cost , MAX( parsing_schema_name ) parsing_schema_name , MAX( hash_value ) hash_value , plan_hash_value , MAX( MODULE ) MODULE , SUM( cpu_time ) cpu_time , SUM( elapsed_time ) elapsed_time , MAX( last_load_time ) last_load_time FROM w_sql_face WHERE 1=1 GROUP BY inst_id , plan_hash_value ) s WHERE f.rk = 1 AND f.plan_hash_value = s.plan_hash_value AND f.inst_id = s.inst_id AND f.sql_id = p.sql_id AND f.inst_id = p.inst_id GROUP BY p.id , p.sql_id , p.parent_id , p.plan_hash_value ) x ) a ) a ORDER BY bg_seq# , seq# ;