오라클 성능 트러블슈팅의 기초 (2012년)
DBMS_UTILITY 0 0 20,258

by 구루비스터디 DBMS_UTILITY PLSQL 패키지 [2023.09.05]


DBMS_UTILITY

시간값 얻기

  • 특정 작업의 소요 시간을 알기위해 DBMS_UTILITY.GET_TIME 함수를 사용할 수 있다.
  • 단위: 1/100초
  • 사용 방법: 절대값은 의미없고, 특정 기간의 차이 값을 통해 소요 시간을 구할 수 있다.
  • 예제는 다음과 같다.
SQL> col cur_hsec new_value cur_hsec
SQL> select dbms_utility.get_time as cur_hsec from dual;
-- 작업 진행
SQL> select trunc((dbms_utility.get_time - &cur_hsec)/100, 2)  as elapsed from dual;

  • test
ORACLE@CX3WAS1 >col cur_hsec new_value cur_hsec
ORACLE@CX3WAS1 >select dbms_utility.get_time as cur_hsec from dual;

  CUR_HSEC
----------
-1.488E+09

ORACLE@CX3WAS1 >select count(*) from all_objects;

  COUNT(*)
----------
      6974

ORACLE@CX3WAS1 >select trunc((dbms_utility.get_time - &cur_hsec)/100, 2)  as elapsed from dual;
old   1: select trunc((dbms_utility.get_time - &cur_hsec)/100, 2)  as elapsed from dual
new   1: select trunc((dbms_utility.get_time - -1.488E+09)/100, 2)  as elapsed from dual

   ELAPSED
----------
  -1755.34

V$TIMER을 읽어서 DBMS_UTILITY.GET_TIME과 같은 일을 할 수 있다.
  • 일반계정인 경우
ORACLE@CX3WAS1 >select hsecs from V$TIMER;
select hsecs from V$TIMER
                  *
ERROR at line 1:
ORA-00942: table or view does not exist


ORACLE@CX3WAS1 >desc V$TIMER;
ERROR:
ORA-04043: object "SYS"."V_$TIMER" does not exist

SYS@CX3WAS1 >desc V$TIMER;
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 HSECS                                                                      NUMBER

SYS@CX3WAS1 >select hsecs from V$TIMER;

     HSECS
----------
2806856002

DBA 값 얻기

  • 16진수나 10진수로 표현된 DBA(Data Block Address)값을 파일번호+블록 번호로 변환하는 방법을 알아보자. 이때, DBMS_UTILITYDATA_BLOCK_ADDRESS_FILE 함수와 DATA_BLOCK_ADDRESS_BLOCK 함수를 사용한다.
  • 테스트 테이블은 다음과 같이 만들었다.
ORACLE@CX3WAS1 >create table t1 as select level as c1 from dual connect by level <= 100;
Table created.
ORACLE@CX3WAS1 >create index t1_n1 on t1(c1);
Index created.

  • id 정보를 확인하고 트레이스를 생성한다. (sys)

SYS@CX3WAS1 >col data_object_id new_value obj_id
SYS@CX3WAS1 >select data_object_id from dba_objects
where owner = 'ORACLE' and object_name = 'T1_N1';  2

DATA_OBJECT_ID
--------------
        65268

SYS@CX3WAS1 >alter session set events 'immediate trace name treedump level &obj_id';
old   1: alter session set events 'immediate trace name treedump level &obj_id'
new   1: alter session set events 'immediate trace name treedump level      65268'

  • trace file에서 블록 정보를 확인한다.
----- begin tree dump
leaf: 0x1c0004b 29360203 (0: nrow: 100 rrow: 100)
----- end tree dump

  • 여기서 0x1c0004b은 DBA의 16진수값이며, 29360203은 DBA의 10 진수값이다.
  • REGEXP_REPLACE함수를 사용하면 위이 정보로 10진수의 DBA값을 추출할 수 있다.
SQL> col dba new_value dba
SQL> select regexp_replace(column_value,
            'leaf: 0x[[:xdigit:]]+ ([[:digit:]]+) [[:print:]]+', '\1') as dba
   from table(tpack.get_tracefile_contents(tpack.get_tracefile_name))
  where column_value like 'leaf:%'
    and rownum = 1;

  • 하지만 tpack이 없어서 잘 안된다. 이와 같이 추출한 DBA값을 DBMS_UTILITY패키지를 이용해서 변환 할 수 있다.

SQL> col file_no new_value file_no
SQL> col block_no new_value block_no
SQL> select dbms_utility.data_block_address_file(&dba) as file_no,
dbms_utility.data_block_address_block(&dba) as block_no
from dual;

  • 이와 같이 파일 번호와 블록 번호를 얻은 후 블록 덤프를 수행하거나 기타 필요한 작업을 수행하면 된다.
SQL> alter system dump datafile &file_no block &block_no;

  • 테스트는 다음과 같다.
SYS@CX3WAS1 >col file_no new_value file_no
SYS@CX3WAS1 >col block_no new_value block_no
SYS@CX3WAS1 >select dbms_utility.data_block_address_file(29360203) as file_no,
  2  dbms_utility.data_block_address_block(29360203) as block_no
  3  from dual;

   FILE_NO   BLOCK_NO
---------- ----------
         7         75

SYS@CX3WAS1 >alter system dump datafile &file_no block &block_no;
old   1: alter system dump datafile &file_no block &block_no
new   1: alter system dump datafile          7 block         75

System altered.

"데이터베이스 스터디모임" 에서 2012년에 "오라클 성능 트러블슈팅의 기초 " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4271

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입