Post List

2025년 6월 24일 화요일

Shared Pool Size예상

Describe SharedPoolSize예상 here


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;





댓글 없음:

댓글 쓰기