본문 바로가기
DBMS/ORACLE

특정 SQL_ID shared pool 에서 flush 하기

by 드바 2022. 9. 5.
테스트 등의 이유로 현재 shared pool 에 등록되어 있는 sql_id 를 삭제 하고자 할 때
운영 시스템에서 shared pool 의 모든 SQL을 flush 할 수는 없는 경우 사용

 

dbms_shared_pool.purge
dbms_shared_pool.purge

 

flush 대상 조회

shared pool에서 제거하기 위한 커서의  address, hash_value 값을 확인합니다

-- flush 대상 SQL 조회
SQL> SELECT substr(sql_text,1,30) sql_text, sql_id, address, hash_value, executions, object_status, LAST_ACTIVE_TIME 
FROM v$sqlarea
WHERE 1=1
--AND sql_text LIKE 'SELECT /* SPK */%' 
AND sql_id = 'brsj9n8w4vgqx'
; 

SQL_TEXT		       SQL_ID	     ADDRESS	      HASH_VALUE EXECUTIONS OBJECT_STATUS	LAST_ACTIVE_TIME
------------------------------ ------------- ---------------- ---------- ---------- ------------------- ------------------
SELECT /* SPK */ count(*) FROM brsj9n8w4vgqx 000000006337E198  944619229	  1 VALID		05-SEP-22

 

LCO(library cache object) 제거

'address,hash_value' 값을 넣어 dbms_shared_pool.purge를 실행합니다

-- ADDRESS, HASH_VALUE 값을 넣어준다
SQL> exec dbms_shared_pool.purge ('000000006337E198,944619229','C');

PL/SQL procedure successfully completed.

-- 해당 커서 제거됨
SQL> SELECT substr(sql_text,1,30) sql_text, sql_id, address, hash_value, executions, object_status, LAST_ACTIVE_TIME 
FROM v$sqlarea
WHERE 1=1
--AND sql_text LIKE 'SELECT /* SPK */%' 
AND sql_id = 'brsj9n8w4vgqx'
;

no rows selected

-- 동일한 SQL 수행
SQL> SELECT /* SPK */ count(*) FROM sk.tab1 ;

  COUNT(*)
----------
     72709

-- 새로 파싱된 SQL이 v$sql에 등록됨
SQL> SELECT substr(sql_text,1,30) sql_text, sql_id, address, hash_value, executions, object_status, LAST_ACTIVE_TIME 
FROM v$sqlarea
WHERE 1=1
AND sql_text LIKE 'SELECT /* SPK */%' 
--AND sql_id = 'brsj9n8w4vgqx'
;

SQL_TEXT		       SQL_ID	     ADDRESS	      HASH_VALUE EXECUTIONS OBJECT_STATUS	LAST_ACTIVE_TIME
------------------------------ ------------- ---------------- ---------- ---------- ------------------- ------------------
SELECT /* SPK */ count(*) FROM brsj9n8w4vgqx 000000006337E198  944619229	  1 VALID		05-SEP-22

SQL>

 

 

댓글