오라클 성능 트러블슈팅의 기초 (2012년)
V$EVENT_NAME 뷰 0 0 38,865

by 구루비스터디 V$EVENT_NAME 대기 이벤트 10046 [2023.09.06]


V$EVENT_NAME 뷰

V$EVENT_NAME 뷰 DESC



DESC V$EVENT_NAME;

Name            Null?    Type
--------------- -------- ---------------
EVENT#                   NUMBER
EVENT_ID                 NUMBER
NAME                     VARCHAR2(64)
PARAMETER1               VARCHAR2(64)
PARAMETER2               VARCHAR2(64)
PARAMETER3               VARCHAR2(64)
WAIT_CLASS_ID            NUMBER
WAIT_CLASS#              NUMBER
WAIT_CLASS               VARCHAR2(64)



각 컬럼에 대한 간략한 설명

NAME대기 이벤트의 이름을 의미함. 보통 기다리는 원인을 이름으로 사용함.
PARAMETER1어떤 자원을 획득하려고 대기하는지에 대한 정보 #1
PARAMETER2어떤 자원을 획득하려고 대기하는지에 대한 정보 #2
PARAMETER3어떤 자원을 획득하려고 대기하는지에 대한 정보 #2
WAIT_CLASS대기 이벤트의 분류



'PARAMETER1, PARAMETER2, PARAMETER3'으로 이루어진 자원을 획득하려고 하지만, NAME이라는 이유로 인해 획득하지 못하고 대기함.


WAIT_CLASS

  • 이 컬럼은 어떤 종류의 대기인지를 보다 직관적으로 알 수 있도록 하기 위함.
  • Others는 "문지 모르는" 대기 이벤트이며, 대부분을 차지함.


소스코드

-- 1. 오라클 버전
SELECT *
FROM   v$version;

-- 2. 대기이벤트 종류
SELECT WAIT_CLASS,
       COUNT(*)
FROM   V$EVENT_NAME
GROUP BY WAIT_CLASS
ORDER BY 2 DESC;

수행내역

KENZO:xsoftdb:SYSTEM >
  1  SELECT *
  2  FROM   v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

KENZO:xsoftdb:SYSTEM >
  1  SELECT WAIT_CLASS,
  2         COUNT(*)
  3  FROM   V$EVENT_NAME
  4  GROUP BY WAIT_CLASS
  5  ORDER BY 2 DESC;

WAIT_CLASS                                                         COUNT(*)
---------------------------------------------------------------- ----------
Other                                                                   717
Idle                                                                     94
Administrative                                                           54
Cluster                                                                  50
User I/O                                                                 45
Network                                                                  35
Concurrency                                                              32
System I/O                                                               30
Configuration                                                            24
Application                                                              17
Queueing                                                                  9
Scheduler                                                                 7
Commit                                                                    2


대기 이벤트 상세 정보

  • PRINT_TABLE 프로시저 필요
소스코드

BEGIN
    PRINT_TABLE('SELECT *
                 FROM    V$EVENT_NAME
                 WHERE   NAME = ''db file sequential read''');
END
;

수행내역

KENZO:xsoftdb:SYSTEM >
  1  BEGIN
  2      PRINT_TABLE('SELECT *
  3                   FROM    V$EVENT_NAME
  4                   WHERE   NAME = ''db file sequential read''');
  5  END
  6  ;
  7  /
EVENT#                        : 143
EVENT_ID                      : 2652584166
NAME                          : db file sequential read
PARAMETER1                    : file#
PARAMETER2                    : block#
PARAMETER3                    : blocks
WAIT_CLASS_ID                 : 1740759767
WAIT_CLASS#                   : 8
WAIT_CLASS                    : User I/O
---------------------------------------------------------------------------

  • 'db file sequential read' 이벤트의 의미는 다음과 같이 정의 가능.
    • DBA 'file#, block#'에 해당하는 데어터 블록을 싱글 블록 I/O로 읽어서 버퍼 캐시에 적재하려고 하지만(db file sequential read), 아직 I/O가 끝나지 않아서 대기하는 상태이다. 이 대기는 User I/O에 해당함.


PRINT_TABLE 프로시저


CREATE OR REPLACE PROCEDURE PRINT_TABLE(P_QUERY IN VARCHAR2) AUTHID CURRENT_USER IS

    l_theCursor    INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
    l_columnValue  VARCHAR2(4000);
    l_status       INTEGER;
    l_descTbl      DBMS_SQL.DESC_TAB;
    l_colCnt       NUMBER;

BEGIN
    DBMS_SQL.PARSE(l_theCursor, p_query, DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS(l_theCursor, l_colCnt, l_descTbl);

    FOR i IN 1..l_colCnt LOOP
        DBMS_SQL.DEFINE_COLUMN(l_theCursor, i, l_columnValue, 4000);
    END LOOP;

    l_status := DBMS_SQL.EXECUTE(l_theCursor);

    WHILE(DBMS_SQL.FETCH_ROWS(l_theCursor) > 0) LOOP
        FOR i IN 1..l_colCnt LOOP
            DBMS_SQL.COLUMN_VALUE(l_theCursor, i, l_columnValue);
            DBMS_OUTPUT.PUT_LINE(RPAD(l_descTbl(i).col_name, 30) || ': ' || l_columnValue);
        END LOOP;

        DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------------');
    END LOOP;

    DBMS_SQL.CLOSE_CURSOR(l_theCursor);
EXCEPTION
    WHEN OTHERS THEN
        RAISE;
END;
/

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

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

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

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

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