CREATE OR REPLACE FUNCTION calc_shared_pool(max_users IN NUMBER)
RETURN NUMBER
IS
--------------------------------------------------
-- 반드시 as sysdba 권한을 가진 사용자로 접속한다.
--------------------------------------------------
session_id NUMBER; --sample session id
session_uga_max NUMBER; -- session uga_memory max
sql_area NUMBER;
plsql_area NUMBER;
temp NUMBER;
BEGIN
-- 하나의 세션이 가지는 메모리에 대한 샘플 세션을 가져온다.
SELECT id INTO session_id
FROM (SELECT sid AS id
FROM v$process p, v$session s
WHERE p.addr = s.paddr
ORDER BY dbms_random.VALUE)
WHERE ROWNUM = 1;
--dbms_output.put_line('샘플 세션 ID : ' || session_id);
--해당 세션에 가질 수 있는 최대 메모리
SELECT VALUE INTO session_uga_max
FROM v$sesstat s, v$statname n
WHERE s.statistic# = n.statistic#
AND n.NAME = 'session uga memory max'
AND sid = session_id;
--dbms_output.put_line('해당 세션에 가질 수 있는 최대 메모리 : ' || session_uga_max);
--Total Shared SQL Area
SELECT SUM(sharable_mem) INTO sql_area
FROM v$sqlarea;
--PL/SQL Sharable Memory Area
SELECT SUM(sharable_mem) INTO plsql_area
FROM v$db_object_cache;
--최소 Shared Pool Size 계산
temp := (session_uga_max * max_users) + sql_area + plsql_area;
RETURN CEIL((temp + temp*0.3)/1024/1024);
END;
/
--Shared Pool의 크기는 이제부터다.
--Shared Pool 크기 계산을 위한 임시테이블을 생성후 주기적으로 아래와 같은
--Insert ~ Select 문을 이용해서 삽입한후 마지막으로 가장 큰 값을 찾아낸다.
CREATE TABLE temp_shared_pool_size(nSIZE NUMBER);
INSERT INTO temp_shared_pool_size
SELECT calc_shared_pool(400) "최소 Shared Pool Size(MB)"
FROM dual;
--이 결과는 Shared Pool의 최소 크기임을 명심해야 한다. 되도록이면 더 크게 잡아준다.
SELECT MAX(nSIZE) FROM temp_shared_pool_size;
'oracle10R2' 카테고리의 다른 글
ASM (0) | 2011.06.22 |
---|---|
Oracle DICTIONARY (0) | 2011.06.20 |
SQL * Loader (0) | 2011.06.20 |
Library Cache (0) | 2011.06.20 |
enqueues (0) | 2011.06.20 |