TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-16 |
제목 | Kill된 세션의 Clean-Up 작업 예상 시간 추정 방법 | ||
---|---|---|---|
Kill된 세션의 Clean-Up 작업 예상 시간 추정 방법
(Estimated Clean-Up Time for a Killed Session) ============================================== (1) 개요 사용자 에플리케이션의 문제 등으로 강제로 종료된 세션은 완전히 롤백 작업 (clean-up)이 종료되기 전에는 resource에 대한 점유가 유지된다. (Bul:10852 -"ALTER SYSTEM KILL SESSION 에 대하여(ORA-30)" 참조) 따라서 롤백 작업 종료 시간의 예상은 개발자나 운영자에게 상당한 도움이 될 수 있으나, 적절한 도구가 없었다. 본 자료에서는 다음 이슈를 다룬다. 1. 트랜잭션 유형별 롤백 엔트리 성향 분석. 2. 롤백 엔트리 clean-up 완료 시간을 예측하는 스크립트. (2) 트랜잭션 유형별 롤백 엔트리 성향 분석. 롤백 엔트리가 보관되는 딕셔너리는 V$TRANSACTION 중 USED_UBLK와 USED_UREC 이며, 다음과 같은 명령어로 조회가 가능하다. SQL> select sid, serial#, username, taddr, used_ublk, used_urec 2 from v$transaction t, v$session s 3 where t.addr = s.taddr; SID SERIAL# USERNAME TADDR USED_UBLK USED_UREC ---------- ---------- ----------------- -------- ---------- ---------- 13 33 IJYEO 3129FEE8 78 1000 여기서 TADDR은 'transaction address'이며, USED_UBLK과 USED_UREC은 각각 롤백 엔트리가 저장된 블럭 및 레코드를 나타낸다. 다음은 테이블 및 트랜잭션 유형에 따른 테스트 내역이다. ㅇ DML 유형: I(Insert)/U(Update)/D(Delete) ㅇ 테이블 구성: - Tab1: NUMBER 타입 1 개의 컬럼으로 구성된 테이블 - Tab2: CHAR(10) 타입 1 개의 컬럼으로 구성된 테이블 - Tab3: NUMBER 타입 5 개의 컬럼으로 구성된 테이블 - Tab4: CHAR(10) 타입 5 개의 컬럼으로 구성된 테이블 ㅇ 테스트에 사용된 테이블 레코드 수: 1,000 개 ㅇ 테스트 결과: 테스트 유형별 롤백 엔트리 량 및 clean-up 소요 시간 DML Tab1:NUMBER Tab2:CHAR(10) Tab3:NUMBER*5 Tab4:CHAR(10)*5 ====== =============== =============== =============== =============== Insert I1:38/1000/1:51 I2:37/1000/1:58 I3:38/1000/1:58 I4:37/1000/1:58 Update U1:44/1000/2:00 U2:48/1000/2:06 U3:58/1036/2:13 U4:77/1000/2:07 Delete D1:53/1006/2:13 D2:57/1009/2:10 D3:64/1013/2:06 D4:84/1034/2:13 [범례]: 테스트 코드/USED_UBLK/USED_UREC/경과 시간(분:초) ㅇ 테스트 결과: 롤백 엔트리의 성향 1. init parameter CLEANUP_ROLLBACK_ENTRIES(=20: default) 단위로 USED_UREC이 감소한다. 2. 컬럼의 갯수나 타입은 Insert나 Update시에만 USED_UBLK 량에 영향을 준다. 3. 블럭의 크기(USED_UBLK)는 롤백 시간에 영향을 주지 않고 엔트리 갯 (USED_UREC)만 영향을 준다. 4. Insert보다는 Update가, Update보다는 Delete가 롤백 블럭을 상대적으로 많이 발생시킨다. 5. 한 테이블에 대해서 많은 건 수의 DML이 수행된 경우(동일한 DML의 반복 수행일 경우에도), USED_UBLK와 USED_UREC가 누적되어 기록된다. 6. 시스템 성능이나 Oracle 버젼에 따른 처리 시간의 차이는 크지 않으나, Update와 Update의 경우 Oracle8이 Oracle7 보다 롤백 블럭을 약간 많이 (30% 가량) 발생한다. (3) 롤백 엔트리 clean-up 완료 시간을 예측하는 스크립트. 다음 스크립트는 일정 시간(10초)동안 USED_UREC의 변화를 기초로 하여 전체 완료 시간을 예측하는 유틸리티이다. 수행 시간을 크게 조정하여 보다 정확한 완료 시간 을 얻을 수 있다. [주의] 위에서 확인한 조회를 통해 V$SESSION에서 TADDR 값을 확인하여 반드시 decalre 문에 지정 하여야 함. -------------------------- Cut Here -------------------------- set serveroutput on; declare flag number := 0; t varchar(8) := '30C7B450'; -- V$SESSION의 TADDR 값 urec_init number; urec_next number; time_init number; time_next number; time_left number; begin select used_urec into urec_init from v$transaction where addr = t; select hsecs into time_init from v$timer; while (flag <= 0) loop select used_urec into urec_next from v$transaction where addr = t; select hsecs into time_next from v$timer; if (time_init + 1000 < time_next) then -- 수행 시간 설정 (단위: 1/100 초) flag := flag + 1; end if; end loop; time_left := round(urec_next/(urec_init - urec_next)*(time_next - time_init)/100); dbms_output.put_line('Estimate Clean-Up Time: ' ||to_char(trunc(time_left/3600))||' Hours ' ||to_char(trunc(mod(time_left,3600)/60))||' Minutes ' ||to_char(trunc(mod(mod(time_left,3600),60)))||' Seconds'); exception when NO_DATA_FOUND then dbms_output.put_line('Clean-Up Completed.'); when ZERO_DIVIDE then dbms_output.put_line('Can''t Estimate Time Now. Run later.'); end; / Reference Documents -------------------- |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |