두 개념 모두 V9.7에서 나온 것으로 알고 있다.
옵티마이저가 SQL을 어떻게 계획을 수립하여 실행할 지를 알고자 access plan을 보지만, 이것은 예상 계획일 뿐 “실제로 실행한 plan”을 보여주지는 않는다.
실제 수행한 plan에 대한 정보는 db2에서 actual section 이라는 개념으로 제공되고 actual section을 얻기 위해서는 “워크로드"와 “이벤트 모니터"를 사용해야 된다.
1. actual section을 수집하기 위한 절차
(1) DB CFG 구성변수 설정 - section_actuals (값: base)
(2) Workload 생성 - 수집하고자 하는 SQL을 수행하는 application name 을 알아야 함
(3) Event Monitor 생성
(4) Explain 시간소 확인 - 저장 프로시저 EXPLAIN_FROM_ACTIVITY 수행
(5) db2exfmt 수행하여 plan 정보 수집
2. 테스트
- db2 서버 local에서 테스트를 하기 때문에 application name 이 db2bp.exe 에 대하여 workload를 생성함
# APP NAME 이름 확인 $> db2 list applications # db2bp.exe에 대한 워크로드 wl1 생성 $> db2 "create workload wl1 applname('db2bp.exe') collect activity data with details, section" # 사용 권한 PUBLIC 으로 설정 $> db2 "grant usage on workload wl1 to public" # 이벤트 모니터 생성 $> db2 "create event monitor actevmon for activities write to table" # 활성화 $> db2 "set event monitor actevmon state 1" # SQL 수행 (db2bp.exe가 수행되는 터미널/CLP 창에서 수행) # APP ID, UOW ID 등 확인 $> db2 "select varchar(appl_id,20) appl_id, uow_id, activity_id, varchar(stmt_text,50) stmt_text from activitystmt_actevmon" APPL_ID UOW_ID ACTIVITY_ID STMT_TEXT # Explain 시간 확인 $> db2 "call explain_from_activity('*LOCAL.DB2_01.140129001143',2,1,'ACTEVMON','BRAD',?,?,?,?,?)" 출력 매개변수 값 매개변수 이름: EXPLAIN_REQUESTER 매개변수 이름: EXPLAIN_TIME 매개변수 이름: SOURCE_NAME 매개변수 이름: SOURCE_SCHEMA 매개변수 이름: SOURCE_VERSION 리턴 상태 = 0 # Actual Section 수집 $> db2exfmt -d sample -w 2014-01-29-09.25.36.178000 -n SQLC2K26 -s NULLID -# 0 -t Access Plan: Rows # 이벤트 모니터 비활성화 $> db2 "set event monitor actevmon state 0" |
위 plan의 경우 예측된 rows 값과 actual rows값이 동일하다. 즉 통계정보 갱신이 적절히 되어 차이가 존재하지 않음을 알 수 있다.
actual section 의 존재에 대해서는 알게 된지 오래 되었지만, 설정 작업이 많고 application name 등을 확인해야 하는 등 불편함이 느껴져서 잘 쓰게 되지 않았다.
db2 문서들을 검색하다 알게된 db2caem 이라는 유틸리티를 통해서도 actual section을 수집할 수 있다.
위와 같은 여러 수행 절차없이 원하는 SQL 구문만 알고 있으면 actual section 정보를 수집할 수 있다.
(주) caem: Capture Activity Event Monitor data tool
3. db2caem 테스트
$> db2pd -db sample -dbcfg | grep -i section SECTION_ACTUALS NONE NONE $> cat > 02.sql1.db2 <<EOF select * from t2 where c2 > 0 ; EOF $> db2caem -d sample -sf 02.sql1.db2 –o 출력경로 $> cat 출력경로/db2caem.exfmt.1 Access Plan: Rows |
actual section 을 통해서 옵티마이저가 계획한 방식대로 수행되었는지 확인을 할 수 있고,
건수의 차이를 통하여 통계정보의 적절성을 판단할 수 있을 것 같다.
'Note' 카테고리의 다른 글
[관리] Backup Pending 풀기 (0) | 2014.03.31 |
---|---|
[구성] Federation MS-SQL Server (0) | 2014.03.20 |
[성능] SQL Optimizer Profile (0) | 2014.02.06 |
[이관] lobsinfile 및 tempfiles path (0) | 2014.01.27 |
[이관] admin_cmd 프로시저를 이용한 이관 자동화 (0) | 2014.01.27 |