RowCache의 Miss율을 보여준다
/* rowCache 의 MissRatio를 조사하는 스크립트
** <<박제용 99.11>>
** 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;
Library Cache의 Hitratio를 보여준다.(shared_pool의 size결정을위해)
/* library Cache Hitratio 출력 스크립트
** <<박제용 99.11>>
** 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;
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);
explain을 보기 쉽게 출력해주는 SQL
*
** 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;
세션별로 과도한 memory 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;
과도한 memory read를 하는 SQL문을 찾아주는 스크립트
/*
** 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;
과도한 disk read를 하는 SQL문을 찾아주는 스크립트
/*
** 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;
SGA의 shared pool내에 캐쉬된 object중 큰 영역을 차지 하고 있는 것을 찾아주는 스크립트
/*
** 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';
SGA의 shared pool 의 현재 사용도를 출력해주는 SQL
/*
** 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;
|