>  기사  >  데이터 베이스  >  ORACLE은 SPM을 통해 SQL 문에 HINT를 추가합니다.

ORACLE은 SPM을 통해 SQL 문에 HINT를 추가합니다.

巴扎黑
巴扎黑원래의
2016-11-21 15:25:331226검색

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;

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.