'script'에 해당되는 글 3건

  1. 2011.12.21 ORACLE Session Statistics 쿼리
  2. 2009.08.28 oracle script
  3. 2009.08.28 유용한 오라클 스크립트..
ORACLE/SCRIPT2011. 12. 21. 10:24
반응형

 

Here are some scripts related to Session Statistics .

Session I/O By User

SESSION I/O BY USER NOTES:

  • Username - Name of the Oracle process user
  • OS User - Name of the operating system user
  • PID - Process ID of the session
  • SID - Session ID of the session
  • Serial# - Serial# of the session
  • Physical Reads - Physical reads for the session
  • Block Gets - Block gets for the session
  • Consistent Gets - Consistent gets for the session
  • Block Changes - Block changes for the session
  • Consistent Changes - Consistent changes for the session

    select	nvl(ses.USERNAME,'ORACLE PROC') username,
    	OSUSER os_user,
    	PROCESS pid,
    	ses.SID sid,
    	SERIAL#,
    	PHYSICAL_READS,
    	BLOCK_GETS,
    	CONSISTENT_GETS,
    	BLOCK_CHANGES,
    	CONSISTENT_CHANGES
    from	v$session ses, 
    	v$sess_io sio
    where 	ses.SID = sio.SID
    order 	by PHYSICAL_READS, ses.USERNAME
    
    

    CPU Usage By Session

    CPU USAGE BY SESSION NOTES:

  • Username - Name of the user
  • SID - Session id
  • CPU Usage - CPU centiseconds used by this session (divide by 100 to get real CPU seconds)

    select 	nvl(ss.USERNAME,'ORACLE PROC') username,
    	se.SID,
    	VALUE cpu_usage
    from 	v$session ss, 
    	v$sesstat se, 
    	v$statname sn
    where  	se.STATISTIC# = sn.STATISTIC#
    and  	NAME like '%CPU used by this session%'
    and  	se.SID = ss.SID
    order  	by VALUE desc
    
    

    Resource Usage By User

    RESOURCE USAGE BY USER NOTES:

  • SID - Session ID
  • Username - Name of the user
  • Statistic - Name of the statistic
  • Value - Current value

    select 	ses.SID,
    	nvl(ses.USERNAME,'ORACLE PROC') username,
    	sn.NAME statistic,
    	sest.VALUE
    from 	v$session ses, 
    	v$statname sn, 
    	v$sesstat sest
    where 	ses.SID = sest.SID
    and 	sn.STATISTIC# = sest.STATISTIC#
    and 	sest.VALUE is not null
    and 	sest.VALUE != 0            
    order 	by ses.USERNAME, ses.SID, sn.NAME
    
    

    Session Stats By Session

    SESSION STAT NOTES:

  • Username - Name of the user
  • SID - Session ID
  • Statistic - Name of the statistic
  • Usage - Usage according to Oracle

    select  nvl(ss.USERNAME,'ORACLE PROC') username,
    	se.SID,
    	sn.NAME stastic,
    	VALUE usage
    from 	v$session ss, 
    	v$sesstat se, 
    	v$statname sn
    where  	se.STATISTIC# = sn.STATISTIC#
    and  	se.SID = ss.SID
    and	se.VALUE > 0
    order  	by sn.NAME, se.SID, se.VALUE desc
    
    

    Cursor Usage By Session

    CURSOR USAGE BY SESSION NOTES:

  • Username - Name of the user
  • Recursive Calls - Total number of recursive calls
  • Opened Cursors - Total number of opened cursors
  • Current Cursors - Number of cursor currently in use

    select 	user_process username,
    	"Recursive Calls",
    	"Opened Cursors",
    	"Current Cursors"
    from  (
    	select 	nvl(ss.USERNAME,'ORACLE PROC')||'('||se.sid||') ' user_process, 
    			sum(decode(NAME,'recursive calls',value)) "Recursive Calls",
    			sum(decode(NAME,'opened cursors cumulative',value)) "Opened Cursors",
    			sum(decode(NAME,'opened cursors current',value)) "Current Cursors"
    	from 	v$session ss, 
    		v$sesstat se, 
    		v$statname sn
    	where 	se.STATISTIC# = sn.STATISTIC#
    	and 	(NAME  like '%opened cursors current%'
    	or 	 NAME  like '%recursive calls%'
    	or 	 NAME  like '%opened cursors cumulative%')
    	and 	se.SID = ss.SID
    	and 	ss.USERNAME is not null
    	group 	by nvl(ss.USERNAME,'ORACLE PROC')||'('||se.SID||') '
    )
    orasnap_user_cursors
    order 	by USER_PROCESS,"Recursive Calls"
    
    

    User Hit Ratios

    USER HIT RATIO NOTES:

  • Username - Name of the user
  • Consistent Gets - The number of accesses made to the block buffer to retrieve data in a consistent mode.
  • DB Blk Gets - The number of blocks accessed via single block gets (i.e. not through the consistent get mechanism).
  • Physical Reads - The cumulative number of blocks read from disk.

  • Logical reads are the sum of consistent gets and db block gets.
  • The db block gets statistic value is incremented when a block is read for update and when segment header blocks are accessed.
  • Hit ratio should be > 90%

    select	USERNAME,
    	CONSISTENT_GETS,
            BLOCK_GETS,
            PHYSICAL_READS,
            ((CONSISTENT_GETS+BLOCK_GETS-PHYSICAL_READS) / (CONSISTENT_GETS+BLOCK_GETS)) Ratio
    from 	v$session, v$sess_io
    where 	v$session.SID = v$sess_io.SID
    and 	(CONSISTENT_GETS+BLOCK_GETS) > 0
    and 	USERNAME is not null
    order	by ((CONSISTENT_GETS+BLOCK_GETS-PHYSICAL_READS) / (CONSISTENT_GETS+BLOCK_GETS))


  • 반응형
    Posted by [PineTree]
    ORACLE/SCRIPT2009. 8. 28. 15:34
    반응형
    오라클 9i Release 2 기준으로 작성되었음.

    ◈ SGA 정보보기(정상 설치/실행 상태인가?)
    $ sqlplus system/manager
    SQL> show sga


    ◈ DBA로 접속
    $ sqlplus "sys/passwd as sysdba"


    ◈ DB 시작
    -- 일반 시작
    $ sqlplus "sys/passwd as sysdba"
    startup -- DB 인스턴스 시작
    startup force -- DB가 실행중일 경우 강제로 종료했다 시작
    startup restrict -- 일반 사용자 접근 금지 상태로 DB 시작


    -- 단계별 시작
    $ sqlplus "sys/passwd as sysdba"
    startup nomount; -- NO Mount 단계
    alter database mount; -- Mount 단계
    alter database open; -- Open 단계


    ◈ DB 종료
    $ sqlplus "sys/passwd as sysdba"
    shutdown normal -- 세션,트랜잭션 종료시까지 대기후 종료
    shutdown transactional -- 트랜잭션 종료시까지 대기후 종료
    shutdown immediate -- 즉시 종료. 모든 DML 롤백
    shutdown abort -- 비정상 즉시 종료. 백업과 복구시에만 사용.


    ◈ 로그인 없이 SQL*Plus 만 실행하기
    $ sqlplus "/nolog"


    ◈ Table 생성 스크립트 뽑아내기
    $ exp mlb/mlb file=결과덤프파일.dmp compress=n rows=n tables=테이블명


    ◈ & 기호 이용하기
    1. 첫번째 방법
    SELECT 'You '||Chr(38)||' Me' FROM DUAL;

    2. 두번째 방법
    SET DEFINE OFF
    SELECT 'You & me' FROM DUAL;


    ◈ 편집기 및 SQL*Plus 공통 설정 지정하기
    $ORACLE_HOME/sqlplus/admin/glogin.sql에 SQL*Plus 실행시 항상 지정되는 전체 설정을 할 수 있다.
    여기서 "ed" 명령으로 실행되는 에디터는 다음 처럼 지정할 수 있다.
    DEFINE_EDITOR=gvim.exe


    ◈ 프로시져 혹은 함수등의 소스 뽑아내기
    SET NEWPAGE 0
    SET TERMOUT OFF
    SET VERIFY OFF
    SET SPACE 0
    SET PAGESIZE 0
    SET FEEDBACK OFF
    SET HEADING OFF
    SET TRIMSPOOL ON
    SET LINESIZE 500
    SPOOL procedure_name.sql
    SELECT TEXT FROM USER_SOURCE WHERE NAME='프로시져혹은함수이름' ORDER BY LINE;
    SPOOL OFF

    이렇게 저장된 procedure_name.sql 에서 불필요한 부분을 삭제하한다. 각 줄의 공백은 SET TRIMSPOOL ON 에 의해 제거된다.
    VIM 공백 제거 : :%s/ *$//g
    그리고 이렇게 생성된 소스 맨 앞에 CREATE OR REPLACE PROCEDURE 등을 붙여서 각 프로시져 등의 생성 스크립트로 사용할 수 있게 된다.

    ◈ 오류 내역출력
    SHOW ERRORS

    직전에 발생한 오류 내역 출력

    ◈ 숫자 출력 범위 늘리기
    SET NUM 15

    숫자를 15자리까지 출력

    ◈ 쿼리 결과를 셸 스크립트로 자동 저장하기
    #!/bin/sh
    # 오늘 날짜를 셸 변수로 지정
    TODAY=`date +"%Y%m%d"`

    sqlplus username/password << ENDSQL
    -- 아래는 출력시 불필요한 형식 꾸미기가 안들어가게 한다.
    SET ECHO OFF
    SET NEWPAGE 0
    SET SPACE 0
    SET PAGESIZE 0
    SET FEEDBACK OFF
    SET HEADING OFF
    SET TRIMSPOOL ON

    SPOOL 저장할파일_${TODAY}_ORIG
    SELECT COL1 || '|' || COL2 || '|' || COL3 -- 실행할 쿼리
    FROM MYTABLE;

    SPOOL OFF
    QUIT
    ENDSQL

    # 처음과 마지막 쿼리 잔재 제거. 일단 스풀을 실행해보고나서 파일 위,아래에 추가되는
    # 불필요한 줄수를 알아본다. (여기서는 위에 2줄과 맨 아래 1줄)
    sed -e "1,2d" -e "\$d" 저장할파일_${TODAY}_ORIG > 저장할파일_${TODAY}

    # 최종적으로 "저장할파일_${TODAY}"만 남겨둔다
    rm 저장할파일_${TODAY}_ORIG

    위와 같은 내용으로 셸 스크립트를 만들면 SQL*Plus 로 쿼리 결과를 특정한 형식(여기서는 각 컬럼을 세로 바(|)로 나눈 형식)으로 뽑아낼 수 있다.
    그리고 이 경우 셸 환경 변수 값을 TODAY 처럼 SQL 쿼리 문장에 삽입하는 것이 가능하다.

    ◈ 쿼리 수행 시간 알아내기
    SET TIMING ON

    이렇게 설정하고 쿼리를 날리면 쿼리 수행시간도 함께 출력된다.

    ◈ DBMS_OUTPUT.* 으로 출력되는 양 조절
    SET SERVEROUTPUT ON SIZE 4000;
    Execute DBMS_OUTPUT.PUT_LINE(SYSDATE
    반응형
    Posted by [PineTree]
    ORACLE/SCRIPT2009. 8. 28. 15:02
    반응형
    1. 테이블에 특정컬럼에 중복된 값을 찾는 SQL
    /*--------------------------------------------------------------------------*/
    /* USAGE : @중복찾기.SQL [테이블명] [중복을조사할컬럼명]
    /*
    /* WARNING : 똑같은값이 2개 이상있을때 처음값은 출력 않되고 2번째
    /* 값부터 출력됨. <>
    /*--------------------------------------------------------------------------*/
    SELECT * FROM &1 A
    WHERE ROWID >
    (SELECT MIN(ROWID) FROM &1 B
    WHERE B.&2 = A.&2)
    ORDER BY &2;

    2. PK와 FK간의 연관관계를 찾아 보여주는 SQL
    /*--------------------------------------------------------------------------*/
    /*  사용법     :> @SHOW_POSITIONS  PARENT_TABLE  CHILD_TABLE  
    /*  DESCRIPTION  :  SHOWS PRIMARY AND FOREIGN KEY POSITIONS  
    /*  
    /*  WARNING   :  이 문장은 해당 TABLE의 CONSTRAINT생성시 NAMING   
    /*          CONVENTION을 따른 경우에 적용되도록 되어 있다.  
    /*--------------------------------------------------------------------------*/
    SET VERIFY OFF  
    CLEAR BREAK  
    BREAK ON CONSTRAINT_NAME ON TABLES
    SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
    SUBSTR(TABLE_NAME,1,15) TABLES,
    SUBSTR(COLUMN_NAME,1,15) COL_NAME,
    SUBSTR(POSITION,1,3) POSITION,
    SUBSTR(OWNER,1,7) OWNER
    FROM USER_CONS_COLUMNS
    WHERE TABLE_NAME = UPPER('&1')
    AND CONSTRAINT_NAME LIKE 'PK%'
    UNION
    SELECT SUBSTR(CONSTRAINT_NAME,1,27) CONSTRAINT_NAME,
    SUBSTR(TABLE_NAME,1,15) TABLES,
    SUBSTR(COLUMN_NAME,1,25) COL_NAME,
    SUBSTR(POSITION,1,3) POSITION,
    SUBSTR(OWNER,1,7) OWNER
    FROM USER_CONS_COLUMNS
    WHERE TABLE_NAME = UPPER('&2')
    AND CONSTRAINT_NAME LIKE 'FK%'
    ORDER BY 1 DESC,4 ASC;

    3. 컬럼에 걸려있는 CONSTRAINT 를 보여주는 SQL.
    /*--------------------------------------------------------------------------*/
    /* USAGE : @SHOW_CONSTRAINTS TABLE_NAME COLUMN_NAME
    /* DESCRIPTION: 해당 TABLE의 COLUMN에 걸려 있는 CONSTRAINT를 보여준다.
    /* < 실행 예 >
    /* SQL> @SHOW_CONSTRAINTS WIDGETS LENGTH
    /*--------------------------------------------------------------------------*/
    SET VERIFY OFF
    CLEAR BREAK
    BREAK ON TABLES ON COL_NAME
    SELECT SUBSTR(TABLE_NAME,1,15) TABLES,
    SUBSTR(COLUMN_NAME,1,15) COL_NAME,
    SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME
    FROM USER_CONS_COLUMNS
    WHERE TABLE_NAME = UPPER('&1')
    AND COLUMN_NAME = UPPER('&2');

    4. CONSTRAINT이름으로 해당 테이블과 컬럼찾는 SQL
    /*--------------------------------------------------------------------------*/
    /* USAGE : @SHOW_COLUMNS CONSTRAINT_NAME
    /* DESCRIPTION : SHOWS THE COLUMNS BOUND BY A CONSTRAINT
    /* 사용예 : SQL> @SHOW_COLUMNS PK_EMPNO
    /*--------------------------------------------------------------------------*/
    SET VERIFY OFF
    CLEAR BREAK
    BREAK ON CONSTRAINT_NAME ON TABLES

    SELECT SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME,
    SUBSTR(TABLE_NAME,1,15) TABLES,
    SUBSTR(COLUMN_NAME,1,15) COL_NAME
    FROM ALL_CONS_COLUMNS
    WHERE CONSTRAINT_NAME = UPPER('&1');


    5. 컬럼명만 가지고 테이블과 설정상태를 찾아주는 SQL
    /*--------------------------------------------------------------------------*/
    /* 사용법 : SQL> @COL_FIND [컬럼명]
    /*--------------------------------------------------------------------------*/
    COL CNAME FORMAT A20
    COL COLTYPE FORMAT A10
    COL NULLS FORMAT A5
    COL DEFAULTVAL FORMAT A10

    SELECT TNAME, COLNO, CNAME, COLTYPE, WIDTH, NULLS, DEFAULTVAL
    FROM COL
    WHERE CNAME = UPPER('&1')


    6. 딕셔너리에서 해당 키워드에 관한 뷰, 테이블을 찾아주는 SQL
    /*--------------------------------------------------------------------------*/
    /* 사용법 : SQL> @DIC_FIND [키워드(대소문자가림)]
    /*--------------------------------------------------------------------------*/
    TABLE_NAME FORMAT A15
    COL COMMENTS FORMAT A100

    SELECT * FROM DICTIONARY
    WHERE COMMENTS LIKE ('%&1%')
    /

    7. DEAD LOCK이 발생했을때 발생시킨 유저와 SQL문을 찾아주는 SQL
    /*--------------------------------------------------------------------------*/
    /* 사 용 법  :SQL> @FIND_DEADLOCK
    /*  DESCRIPTION : 데드락이 발생할 경우 LOCKING 된 유저와 SQL문을 보여준다.
    /*  데드락이 발생한 유저를 KILL 하려면.
    /* ALTER SYSTEM KILL SESSION '{SERIAL#},{SID}';
    /*--------------------------------------------------------------------------*/
    SELECT A.SERIAL#, A.SID, A.USERNAME, B.ID1, C.SQL_TEXT
    FROM V$SESSION A, V$LOCK B, V$SQLTEXT C
    WHERE B.ID1 IN( SELECT DISTINCT E.ID1 FROM V$SESSION D, V$LOCK E
    WHERE D.LOCKWAIT = E.KADDR)
    AND A.SID = B.SID
    AND C.HASH_VALUE = A.SQL_HASH_VALUE
    AND B.REQUEST = 0;

    8. 테이블 데이터의 사이즈를 계산해주는 SQL
    /*--------------------------------------------------------------------------*/
    /* TABLE DATA SIZE를 정확히 계산해주는 스크립트. <<박제용>>
    /* 사용법 : @TAB_SIZE [TABLE_NAME]
    /*--------------------------------------------------------------------------*/
    ANALYZE TABLE &1 DELETE STATISTICS;
    ANALYZE TABLE &1 COMPUTE STATISTICS;

    SELECT GREATEST(4, CEIL(NUM_ROWS/
    ((ROUND(((1958-(INI_TRANS*23))*
    ((100-PCT_FREE)/100))/AVG_ROW_LEN)))) * 2048)
    TABLESIZE_KBYTES
    FROM USER_TABLES
    WHERE TABLE_NAME = UPPER('&1');


    9. 테이블을 복사해주는 스크립트 (V8.0 ONLY)
    /*--------------------------------------------------------------------------*/
    /* TABLE을 다른 스키마 혹은 TABLE로 복사 <<박제용>>
    /* NOTICE) 1. ORACLE 8.0 이상에서만 지원.
    /* 2. SQL*NET 이 설정되어 있어야만 한다.
    /* 3. 테이블과 PK만 복사하고 인덱스는 모두 다시 생성해주어야 한다.
    /* 따라서 테이블을 생성해 주고 입력하는것이 좋다.
    /* 4. SQL*PLUS 에서만 실행된다.
    /* 사용법) @TAB_COPY SCOTT/TIGER@LINK SOURCE_TABLE_NAME
    TARGET_TABLE_NAME
    /*--------------------------------------------------------------------------*/
    COPY FROM &1 CREATE &3 USING SELECT * FROM &2

    /* 다른 DB로 복사할때는
    COPY FROM &1 TO &2 CREATE &4 USING SELECT * FROM &3
    */

    /* 미리 만들어진 TABLE에 입력할때는
    COPY FROM &1 INSERT &3 USING SELECT * FROM &2
    */

    10.이미 컴파일된 프로시져소스를 보고싶을 때 사용하는 스크립트.
    /*--------------------------------------------------------------------------*/
    /* PL/SQL 소스를 보기위한 스크립트.. <박제용>
    /* 사용법 : FIND_PLSQL [프로시져명칭]
    /*--------------------------------------------------------------------------*/
    SELECT TEXT
    FROM USER_SOURCE
    WHERE NAME = UPPER('&1')
    ORDER BY LINE;

    11. 테이블이 사용중인 블록 크기를 계산해주는 SQL
    /*--------------------------------------------------------------------------*/
    /* TABLE이 사용하는 블럭 크기를 구하는 스크립트... <<박제용>>
    /* 사용법 : 1) DBA 권한으로 로그인한다.
    /* 2) SQL> @TAB_BLOCK [TABLE명]
    /* NOTICE : SUM(BLOCKS)는 사용하는 블럭의 갯수이며 사이즈는
    /* DB_BLOCK_SIZE를 곱하여 얻을 수 있다.
    /*--------------------------------------------------------------------------*/
    SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SUM(BLOCKS)
    FROM DBA_EXTENTS
    WHERE SEGMENT_NAME = UPPER('&1')
    GROUP BY OWNER, TABLESPACE_NAME, SEGMENT_NAME
    /

    12. SQL CURSOR를 보여주는 스크립트
    /*--------------------------------------------------------------------------*/
    /* SQL CURSOR를 조사하는 스크립트. <<박제용 99.11>>
    /* SQL CURSOR 를 조사하여 부하가 많이 걸리는 SQL문과
    /* 메모리를 조사한다.
    /* LOADS : 캐쉬에서 나갔다 들어온 횟수(BEST=1).
    /* INVALIDATIONS : LRU에서 무효화된 횟수. 이 값이 4이상이면
    /* SHARED_POOL_AREA를 확장해야한다.
    /* PARSE_CALLS : 이 커서의 호출 수.
    /* SORTS : 수행된 소트횟수
    /* COMMAND_TYPE: 2 - INSERT, 3-SELECT, 4-UPDATE, 7-DELETE
    /*--------------------------------------------------------------------------*/
    SELECT SQL_TEXT, LOADS, INVALIDATIONS, PARSE_CALLS, SORTS
    FROM V$SQLAREA
    WHERE SQL_TEXT NOT LIKE '%$%'
    AND COMMAND_TYPE IN(2,3,6,7);

    13. EXPAIN PLAN 결과를 보기 쉽게 출력해주는 스크립트
    /*--------------------------------------------------------------------------*/
    /* EXPAIN PLAN 결과를 보기 쉽게 출력해주는 스크립트.
    /* 1) EXPAIN을 처음 사용할 경우엔 [ORACLE_HOME]/RDBMS/ADMIN/UTLXPLAN.SQL을 실행,
    /* PLAN_TABLE을 생성한다.
    /* 2) 처음 사용이 아니면 DELETE FROM PLAN_TABLE; 을 실행하여 이전 결과를 삭제.
    /* 실행결과 파싱번호(ID)가 길면 SQL이 비효율적이거나, SHARED_POOL_SIZE가 작은것이다.
    /* 기타 SQL문이 인덱스를 사용하는지 등등을 알수 있다.
    /*--------------------------------------------------------------------------*/
    COL OPERATION FORMAT A30
    COL OPTIONS FORMAT A20
    COL ID FORMAT 99

    SELECT ID, LPAD(' ',2*LEVEL) || OPERATION ||
    DECODE(ID, 0, ' COST= ' || POSITION )"OPERATION",
    OPTIONS, OBJECT_NAME "OBJECT"
    FROM PLAN_TABLE
    CONNECT BY PRIOR ID=PARENT_ID
    START WITH ID =0;

    14. 과도한 DISK READ를 수행하는 SQL문을 V$SQLAREA 에서 검색해줌.
    /*--------------------------------------------------------------------------*/
    /* SQL QUERY 튜닝 스크립트.. <박제용>
    /* 과도한 DISK READ를 수행하는 SQL문을 V$SQLAREA 에서 검색해줌.
    /* 원인 => 1) SQL문이 최적화 되지 않아 DISK READ를 많이 할 수 밖에 없는 쿼리일경우.
    /* (INDEX가 없거나 사용되지 않을때)
    /* 2) DB_BLOCK_BUFFERS 또는 SHARED_POOL_SIZE 가 작은 경우. (메모리가 적음)
    /*--------------------------------------------------------------------------*/
    SELECT DISK_READS, SQL_TEXT FROM V$SQLAREA
    WHERE DISK_READS > 10000
    ORDER BY DISK_READS DESC;

    15. 과도한 LOGICAL READ를 수행하는 SQL문을 V$SQLAREA 에서 검색해줌.
    /*--------------------------------------------------------------------------*/
    /* SQL QUERY 튜닝 스크립트.. <박제용>
    /* 과도한 LOGICAL READ를 수행하는 SQL문을 V$SQLAREA 에서 검색해줌.
    /*
    /* 원인 => 1) 인덱스 컬럼에 DISTINCT한 값이 적은, 부적절한 인덱스의 사용.
    /* (대체로 인덱스를 지워야 할 경우)
    /* 2) 최적화 되지 않은 SQL 문장
    /*--------------------------------------------------------------------------*/
    SELECT BUFFER_GETS, SQL_TEXT FROM V$SQLAREA
    WHERE BUFFER_GETS > 200000
    ORDER BY BUFFER_GETS DESC;

    16. 유저별로 과도한 LOGICAL READ를 수행하는 SQL 문 찾기
    /*--------------------------------------------------------------------------*/
    /* SQL QUERY 튜닝 스크립트.. <박제용>
    /* 유저별로 과도한 LOGICAL READ를 수행하는 SQL 문 찾기
    /*--------------------------------------------------------------------------*/
    BREAK ON USER_NAME ON DISK_READS ON BUFFER_GETS ON ROWS_PROCESSED
    SELECT A.USER_NAME, B.DISK_READS, B.BUFFER_GETS, B.ROWS_PROCESSED,
    C.SQL_TEXT
    FROM V$OPEN_CURSOR A, V$SQLAREA B, V$SQLTEXT C
    WHERE A.USER_NAME = UPPER('&&USER') AND A.ADDRESS = C.ADDRESS
    AND A.ADDRESS = B.ADDRESS
    ORDER BY A.USER_NAME, A.ADDRESS, C.PIECE;

    17. SHARED_POOL의 HIT RATIO보는 스크립트
    /*--------------------------------------------------------------------------*/
    ** SHARED_POOL의 HIT RATIO보는 스크립트.. <박제용>
    ** 이 영역은 SQL 쿼리문이 저장되고, 유저별 사용 영역과, 데이터 딕셔너리등이 저장된다.
    ** 만일 적게 할당되면 유저의 접속이 많아질수록 THROUGHPUT에 큰 영향을 준다.
    ** HIT RATIO는 95% 이상을 유지시켜야 한다.
    /*--------------------------------------------------------------------------*/
    SELECT SUM(GETS) "GETS", SUM(GETMISSES) "MISSES",
    (1-(SUM(GETMISSES) / (SUM(GETS)+SUM(GETMISSES))))*100
    "HITRATE"
    FROM V$ROWCACHE;

    18. SHARED_POOL에 저장된 내용보기
    /*--------------------------------------------------------------------------*/
    /* SHARED_POOL에 저장된 내용보기 <박제용>
    /* 프로시져나 패키지등은 SHARED_POOL에 저장되며 저장된 객체중
    /* 그 크기가 100K 가 넘는것을 보여준다.
    /*--------------------------------------------------------------------------*/
    COL NAME FORMAT A30

    SELECT NAME, SHARABLE_MEM
    FROM V$DB_OBJECT_CACHE
    WHERE SHARABLE_MEM > 100000
    AND TYPE IN ('PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'PROCEDURE')
    AND KEPT = 'NO';

    19. SHARED_POOL_SIZE의 현재 사용 현황을 보여줌
    /*--------------------------------------------------------------------------*/
    /* SHARED_POOL_SIZE의 현재 사용 현황을 보여줌. <박제용>
    /* SHARED_POOL_SIZE의 현재의 사용현황을 보여준다.
    /* 이 데이터를 주기적으로 보관하여 분석한다.
    /*--------------------------------------------------------------------------*/
    COL VALUE FOR 999,999,999,999 HEADING "SHARED POOL SIZE"
    COL BYTES FOR 999,999,999,999 HEADING "FREE BYTES"
    SELECT TO_NUMBER(V$PARAMETER.VALUE) VALUE, V$SGASTAT.BYTES,
    (V$SGASTAT.BYTES/V$PARAMETER.VALUE)*100 "PERCENT FREE"
    FROM V$SGASTAT, V$PARAMETER
    WHERE V$SGASTAT.NAME = 'FREE MEMORY'
    AND V$ PARAMETER .NAME = ‘SHARED_POOL_SIZE;

    20. LIBRARY CACHE HITRATIO 출력 스크립트
    /*--------------------------------------------------------------------------*/
    /* LIBRARY CACHE HITRATIO 출력 스크립트
    /* LIBRARY CACHE 의 HITRATIO 가 0.9 이하이면
    /* SHARED POOL SIZE를 늘려주거나, SQL 문의 이상을
    /* 조사해야 한다.
    /*--------------------------------------------------------------------------*/
    SELECT SUM(PINS) EXECUTIONS,
    SUM(PINHITS) "EXECUTION HITS",
    SUM(RELOADS) MISSES,
    ((SUM(PINS) / (SUM(PINS) + SUM(RELOADS))) * 100) HITRATIO
    FROM V$LIBRARYCACHE;

    20. ROWCACHE 의 MISSRATIO를 조사하는 스크립트
    /*--------------------------------------------------------------------------*/
    /* ROWCACHE 의 MISSRATIO를 조사하는 스크립트
    /* ROW CHACHE 의 MISS RATIO는 15% 이하로 유지하는 것이 좋다.
    /* 그렇지 않을경우 SHARED_POOL_SIZE를 늘리는것을 고려해야 한다.
    /*--------------------------------------------------------------------------*/
    SELECT SUM(GETS) "GETS",
    SUM(GETMISSES) "MISSES",
    (1-(SUM(GETMISSES)/(SUM(GETS)+SUM(GETMISSES))))*100 "HITRATE"
    FROM V$ROWCACHE;

    21. SHARED_POOL의 HIT RATIO보는 스크립트
    /*--------------------------------------------------------------------------*/
    /* SHARED_POOL의 HIT RATIO보는 스크립트.. <박제용>
    /* 이 영역은 SQL 쿼리문이 저장되고, 유저별 사용 영역과, 데이터 딕셔너리등이 저장된다.
    /* 만일 적게 할당되면 유저의 접속이 많아질수록 THROUGHPUT에 큰 영향을 준다.
    /* HIT RATIO는 95% 이상을 유지시켜야 한다.
    /*--------------------------------------------------------------------------*/
    SELECT SUM(GETS) "GETS", SUM(GETMISSES) "MISSES",
    (1-(SUM(GETMISSES) / (SUM(GETS)+SUM(GETMISSES))))*100
    "HITRATE"
    FROM V$ROWCACHE;

    22. User의 object 정보 조회

    - user_objects 데이터 사전을 이용하시면 됩니다.


    SQL>col object_name format a25;
    SQL>SELECT object_name, object_type
            FROM user_objects
            WHERE object_type = 'INDEX';

    23. GRANT받은 권한을 조회하는 QUERY


    GRANT받은 권한을 조회하는 QUERY
    ==============================
    SELECT USERNAME, ROLENAME, PRIVILEGE
    FROM (SELECT DECODE(SA1.GRANTEE#, 1, 'PUBLIC', U1.NAME) username,
                 SUBSTR(U2.NAME,1,20) rolename,
                 SUBSTR(SPM.NAME,1,27) PRIVILEGE
          FROM SYS.SYSAUTH$ SA1,
               SYS.SYSAUTH$ SA2,
               SYS.USER$ U1,
               SYS.USER$ U2,
               SYS.SYSTEM_PRIVILEGE_MAP SPM
          WHERE SA1.GRANTEE# = U1.USER#
          AND SA1.PRIVILEGE# = U2.USER#
          AND U2.USER# = SA2.GRANTEE#
          AND SA2.PRIVILEGE# = SPM.PRIVILEGE
          UNION
          SELECT U.NAME username, NULL rolename, SUBSTR(SPM.NAME,1,27) privilege
          FROM SYS.SYSTEM_PRIVILEGE_MAP SPM, SYS.SYSAUTH$ SA, SYS.USER$ U
          WHERE SA.GRANTEE#=U.USER#
          AND SA.PRIVILEGE#=SPM.PRIVILEGE)
    WHERE USERNAME = 'SCOTT';



    출처 : http://blog.empas.com/bjbjhong/7298879  and some additional query..
    반응형
    Posted by [PineTree]