개요
Oracle의 DBMS_SHARED_POOL.PURGE 패키지 기능과 같이 DB 메모리에 저장되어 있는 SQL 실행 플랜을 삭제하는 방법입니다.
방법
Tibero에서는 실행 플랜 삭제를 위해 ALTER SYSTEM FLUSH PPC; 명령어를 사용합니다.
기능 사용 방법은 아래와 같습니다.
alter system flush ppc <child_number> '<sql_id>';
SQL
복사
1.
삭제하려는 physical plan 확인 (SQL_ID : f6kwymknrt7z1)
SQL>
SET AUTOT ON
SET ROWS OFF
SELECT COUNT(*) FROM TAB;
1 row selected.
SQL ID: f6kwymknrt7z1
Child number: 28738
Plan hash value: 3443268965
Execution Plan
--------------------------------------------------------------------------------
1 COLUMN PROJECTION (Cost:40, %%CPU:0, Rows:1)
2 SORT AGGR (Cost:40, %%CPU:0, Rows:1)
3 INDEX JOIN (Cost:40, %%CPU:0, Rows:30)
4 TABLE ACCESS (ROWID): _DD_OBJ (Cost:39, %%CPU:0, Rows:223)
5 INDEX (RANGE SCAN): _DD_OBJ_IDX2 (Cost:6, %%CPU:0, Rows:540)
6 FILTER (Cost:2, %%CPU:0, Rows:1)
7 INDEX (UNIQUE SCAN): _SYS_CON13700693 (Cost:2, %%CPU:0, Rows:1)
Predicate Information
--------------------------------------------------------------------------------
4 - filter: (("_DD_OBJ"."TYPE_NO") IN ((1),(2),(3))) (0.107)
5 - access: ("_DD_OBJ"."OWNER_ID" = USERENV('SCHEMAID')) (0.035)
6 - filter: (("_DD_OBJ"."TYPE_NO") IN ((1),(2),(3))) (0.107)
7 - access: ("T"."TYPE_NO" = "_DD_OBJ"."TYPE_NO") (0.048)
NAME VALUE
------------------------------ ----------
db block gets 0
consistent gets 191
physical reads 0
redo size 0
sorts (disk) 0
sorts (memory) 7
rows processed 1
SQL
복사
2.
V$SQL에 해당 SQL_ID 조회하여 존재 여부 확인
SQL>
SET AUTOT OFF
SET ROWS ON
SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT FROM V$SQL WHERE SQL_ID = 'f6kwymknrt7z1';
SQL_ID CHILD_NUMBER SQL_TEXT
------------- ------------ --------------------------------------------------
f6kwymknrt7z1 28738 SELECT COUNT(*) FROM TAB
SQL
복사
3.
SQL_ID : f6kwymknrt7z1 인 physical plan 삭제
SQL>
ALTER SYSTEM FLUSH PPC 28738 'f6kwymknrt7z1';
System altered.
SQL
복사
4.
V$SQL로 조회하여 삭제 확인
삭제되었기 때문에 존재하지 않음으로 표시됩니다.
SQL>
SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT FROM V$SQL WHERE SQL_ID = 'f6kwymknrt7z1';
0 row selected.
SQL
복사
주의
1.
1번 노드에서 생성된 플랜은 1번 노드에서 아래 기재된 SQL 문구를 수행해야 삭제됩니다.
alter system flush ppc <child_number> '<sql_id>';
SQL
복사
2.
sql_id, child_number 없이 alter system flush ppc; 수행할 경우 모든 플랜이 삭제되므로 사용할 때 alter system flush ppc; 수행하지 말아야 합니다.