SPM을 통해 실행 계획이 정해져 있는 SQL은 DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE를 통해 구현할 수 있습니다. 또한 이 함수를 사용하면 원래 SQL에 HINT를 추가하지 않고도 실행 계획을 수정할 수 있습니다.
DB VERSION:ORACLE 11.2.0.4
OS:CENTOS 6.6
예:
원래 SQL 인덱스:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
힌트를 추가하여 전체 테이블 스캔을 수행하고 싶습니다.
SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
V$SQL에서 쿼리에서 원본 SQL의 SQL_ID=064qcdmgt6thw, HINT=ahdtbgvsd3bht, PLAN_HASH_VALUE=970476072인 SQL의 SQL_ID입니다.
다음을 실행합니다:
DECLARE
CNT NUMBER;
V_SQL CLOB;
BEGIN
--원본 명령문 SQL 텍스트 가져오기
SELECT SQL_FULLTEXT INTO V_SQL FROM V$ SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;
--HINT가 포함된 SQL의 SQL_ID 및 PLAN_HASH_VALUE를 사용하여 원래 문의 SQL을 수정합니다
CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => ' ahdtbgvsd3bht',
PLAN_HASH_VALUE => 970476072,
원본 문장에 HINT를 추가하는 실행 계획이 수정됩니다. 원본 문장을 실행하여 V$SQL의 PLAN_HASH_VALUE 컬럼과 SQL_PLAN_BASELINE 컬럼에서 수정되었는지 확인합니다.
테스트 중에 바인드 변수가 포함된 일부 SQL의 경우 상수 SQL의 SQL_ID 및 PLAN_HASH_VALUE를 수정할 수 없는 것으로 나타났습니다. 이때 EXECUTE IMMEDIATE를 사용하여 바인드 변수가 포함된 SQL을 생성해 볼 수 있습니다. .
예:
DECLARE
V_SQL VARCHAR2(3000);
BEGIN
V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID= :1' ;
즉시 V_SQL 실행
USING 10;
END;
또는
var v number;
exec :v :=10
SELECT /*+FULL( TB_SPM)* /* SCOTT.TB_SPM WHERE OBJECT_ID=:V;