본문 바로가기

모니터링

오라클 모니터링 유용한 SQL

라클에서 성능개선 대상 식별을 위해 모니터링할 때 사용하면 유요한 SQL입니다.

 

1. V$SQLAREA에서 Top SQL 식별

 

SELECT ROUND(BUFFER_GETS/EXECUTIONS) AS BUFFER_GETS_PER_EXEC,  -- 1회 실행당 읽은 블록 수

       ROUND(ELAPSED_TIME/(EXECUTIONS*1000000),2) AS "ELAPSED_TIME_PER_EXEC(Sec)",

                                                           -- 1회 실행당 처리시간(초단위)

       ROUND((ROWS_PROCESSED/EXECUTIONS)) AS ROWS_PER_EXEC,    -- 1회 실행당 처리된 건수

       A.*

FROM (SELECT DECODE(EXECUTIONS,NULL,1,0,1,EXECUTIONS) AS EXECUTIONS,

                                -- 누적 실행 횟수

             BUFFER_GETS,       -- 누적 읽은 블록 수

             DISK_READS,        -- 누적 디스크 읽는 수

             FETCHES,           -- 누적 Fetch 

             ROWS_PROCESSED,    -- 누적 처리한 레코드 수

             CPU_TIME,          -- 누적 CPU사용 시간(microsecond)

             ELAPSED_TIME,      -- 누적 SQL 처리시간(microsecond)

             SQL_TEXT,          -- SQL 텍스트(최대 1,000바이트)

             SQL_ID,

             ADDRESS,

             HASH_VALUE

      FROM V$SQLAREA

      ORDER BY BUFFER_GETS DESC

    ) A

WHERE ROWNUM < 20 ;

 

2.  V$SESSION을 사용한 현재 세션 상태 조회

 

SELECT S.SID AS SID,

       S.SERIAL# AS "Serial#",

       S.USERNAME,

       DECODE(S.COMMAND, '0', 'NO', '1', 'Cr Tab', '2', 'Insert',

              '3', 'Select', '6', 'Update', '7', 'Delete', '9', 'Create Idx',

              '10', 'Drop Idx', '15', 'Alter Tbl', '24', 'Create Proc',

              '32', 'Create Link', '33', 'Drop Link', '36', 'Create RBS',

              '37', 'Alter RBS', '38', 'Drop RBS', '40', 'Alter TBS',

              '41', 'Drop TBS', '42', 'Alter Sess', '45', 'Rollback',

              '47', 'PL/SQL Exe', '62', 'Anal Table', '63', 'Anal Index',

              '85', 'Truncate', 'Unkown Command') Command,

       S.MACHINE ||'['|| S.PROGRAM||']' "Client program",

       ROUND(Q.BUFFER_GETS/Q.EXECUTIONS, 2) AS "Buffer gets per exec",

       W.EVENT || ': ' || S.P1TEXT || ' ' || S.P1 || ',' || S.P2TEXT || ' ' || S.P2 || ','

               || S.P3TEXT || ' ' || S.P3 || ',WAITING:' || S.WAIT_TIME AS "Waiting on",

       S.SQL_ID AS "SQL ID",

       Q.SQL_TEXT AS "SQL Text"

FROM V$SESSION S,

     V$SESSION_WAIT W,

     V$SQLAREA Q

WHERE W.WAIT_TIME = 0

AND   W.SID = S.SID

AND   S.STATUS = 'ACTIVE'

AND   S.TYPE  <> 'BACKGROUND'

AND   S.SQL_ID = Q.SQL_ID

ORDER BY 4;

 

3. V$ACTIVE_SESSION_HISTORY를 이용한 과거 세션 상태 조회

 

SELECT SAMPLE_TIME AS "Time",

       SESSION_ID AS ID,

       SESSION_SERIAL# AS "Serial#",

       (SELECT USERNAME FROM ALL_USERS B WHERE B.USER_ID = A.USER_ID) AS "User name",

       SQL_OPNAME AS "Command",

       MACHINE ||'['|| PROGRAM||']' "Client program",

       CASE WHEN EVENT IS NULL THEN NULL ELSE

       EVENT || ': ' || P1TEXT || ' ' || P1 || ',' || P2TEXT || ' ' || P2 || ','

             || P3TEXT || ' ' || P3 ||',WAITING:' || WAIT_TIME

       END AS "Waiting on",

       SQL_ID AS "SQL ID",

       (SELECT SQL_TEXT FROM V$SQLAREA B WHERE B.SQL_ID = A.SQL_ID) AS "SQL Text"

FROM V$ACTIVE_SESSION_HISTORY A

WHERE SAMPLE_TIME BETWEEN TO_TIMESTAMP('20151028 230029', 'YYYYMMDD HH24MISS')

                  AND TO_TIMESTAMP('20151020 230031', 'YYYYMMDD HH24MISS')

AND SESSION_TYPE != 'BACKGROUND'

ORDER BY 6;

 

4. 현재 수행중인 SQL  수행 상태 보기

<오랜지용>

SELECT DBMS_LOB.SUBSTR(TEXT, 3000, 1) AS TEXT1,

       DBMS_LOB.SUBSTR(TEXT, 3000, 3001) AS TEXT2,

       DBMS_LOB.SUBSTR(TEXT, 3000, 6001) AS TEXT3,

       DBMS_LOB.SUBSTR(TEXT, 3000, 9001) AS TEXT4,

       DBMS_LOB.SUBSTR(TEXT, 3000, 12001) AS TEXT5,

       DBMS_LOB.SUBSTR(TEXT, 3000, 15001) AS TEXT6,

       DBMS_LOB.SUBSTR(TEXT, 3000, 18001) AS TEXT7,

       DBMS_LOB.SUBSTR(TEXT, 3000, 21001) AS TEXT8

FROM (SELECT

      DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id=>'djwgxd2t0adb7', event_detail=>'YES') AS TEXT

      FROM DUAL

     );

 

<SQLPlus 용>

SET LONG 1000000

SET LONGCHUNKSIZE 1000000

SET LINESIZE 1000

SET PAGESIZE 0

SET TRIM on

 

SELECT

   DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id=>'djwgxd2t0adb7', event_detail=>'YES')

FROM DUAL;

 

4. 락 대기 상태 확인

 

SELECT /*+ NO_MERGE(V) ORDERED */

       DECODE(V.HOLD_SID, NULL, '', '(' || V.INST_ID || ')' || V.HOLD_SID) "Hold Sid",

       DECODE(V.WAIT_SID, NULL, '', '^', '',

              '(' || V.INST_ID || ')' || V.WAIT_SID) "Wait Sid",

       V.GB "HW Type",

       SW.SECONDS_IN_WAIT "Wait Time",

       V.TYPE "Lock Type",

       DECODE(V.LMODE, 0, 'None',   -- 'None' ,

                       1, 'Null',   -- 'Null' ,

                       2, 'Row Sh', -- 'Row Share' ,

                       3, 'Row Ex', -- 'Row Exclusive' ,

                       4, 'Share',  -- 'Share' ,

                       5, 'Sh R X', -- 'Share Row Exclusive' ,

                       6, 'Ex',     -- 'Exclusive' ,

                       TO_CHAR(V.LMODE)) "Hold Lock Mode",

       DECODE(V.REQUEST, 0, 'None',    -- 'None' ,

                         1, 'Null',    -- 'Null' ,

                         2, 'Row Sh',  -- 'Row Share' ,

                         3, 'Row Ex',  -- 'Row Exclusive' ,

                         4, 'Share',   -- 'Share' ,

                         5, 'Sh R X',  -- 'Share Row Exclusive' ,

                         6, 'Ex',      -- 'Exclusive' ,

                         TO_CHAR(V.REQUEST)) "Request Lock Mode",

       (SELECT OBJECT_NAME || '(' || SUBSTR(OBJECT_TYPE, 1, 1) || ')'

        FROM   DBA_OBJECTS DO

        WHERE  DO.OBJECT_ID = S.ROW_WAIT_OBJ#) "Locked Object",

       SUBSTR(S.USERNAME, 1, 8) AS "User",

       TO_CHAR(S.SID) || ',' || TO_CHAR(S.SERIAL#) AS SID,

       SUBSTR(STATUS, 1, 1) AS "Status",

       S.PROGRAM as "Program",

       SUBSTR(S.EVENT, 1, 25) AS "Wait Event",

       LAST_CALL_ET AS LCE,

       TRIM((SELECT SUBSTR(SQL_TEXT, 1, 20)

            FROM   GV$SQL SQ

            WHERE  SQ.INST_ID = S.INST_ID

            AND    SQ.SQL_ID = S.SQL_ID

            AND    ROWNUM = 1)) AS "SQL Text"

FROM   (SELECT ROWNUM, INST_ID, SID,

               DECODE(REQUEST, 0, TO_CHAR(SID)) HOLD_SID,

               DECODE(REQUEST, 0, '^', TO_CHAR(SID)) WAIT_SID,

               DECODE(REQUEST, 0, 'holding', 'waiting') GB,

               ID1, ID2, LMODE, REQUEST, TYPE

        FROM   GV$LOCK

        WHERE  (ID1, ID2, TYPE) IN (SELECT ID1,

                                           ID2,

                                           TYPE

                                    FROM   GV$LOCK

                                    WHERE  (REQUEST != 0))

       ) V,

       GV$SESSION S,

       GV$SESSION_WAIT SW,

       GV$PROCESS P

WHERE  V.SID      = S.SID

AND    V.INST_ID  = S.INST_ID

AND    S.SID      = SW.SID

AND    S.INST_ID  = SW.INST_ID

AND    S.PADDR    = P.ADDR

AND    S.INST_ID  = P.INST_ID

ORDER  BY V.ID1,

          V.REQUEST,

          SW.SECONDS_IN_WAIT DESC

 

6. AWR 저장소 확인

 

SELECT SNAP_ID AS "Snap ID", INSTANCE_NUMBER AS "Instance",

       TO_CHAR(STARTUP_TIME, 'YYYYMMDD HH24:MI') AS "DB Start time",

       TO_CHAR(BEGIN_INTERVAL_TIME, 'YYYYMMDD HH24:MI') AS "Begin Time",

       TO_CHAR(END_INTERVAL_TIME, 'YYYYMMDD HH24:MI') AS "End Time",

       SNAP_LEVEL AS "Level"

FROM   DBA_HIST_SNAPSHOT

ORDER BY INSTANCE_NUMBER DESC, SNAP_ID DESC;

 

7. Hard parsing 시간 측정
   AVG_HARD_PARSE_TIME in V$SQLSTATS