0

오라클 (Oracle Enterprise Manager에서 이것을 보았습니다.)에는 Enabled = YES로 설정된 특정 SQL Plan Baseline이 있습니다.SQL Plan Baseline을 강제로 수용하는 방법은 무엇입니까?

그러나 ACCEPTED = YES를 사용할 수 없습니다. 문서에 따르면, 당신은 ENABLED와 ACCEPTED가 필요합니다.

나는베이스 라인을 "진화"하려고했지만 OEM은 보고서를 통해 1.06 배 더 나쁘다고 불평한다. 그것은 사실이 아니지만.

또한 시간이 지남에 따라 자동 제거되지 않는 방법을 알고 싶습니다. 고정되어 있습니다. 감사!

답변

3

기준 사용을 활성화하려면 optimizer_use_sql_plan_baselines이 true이어야합니다.

SELECT * FROM dba_sql_plan_baselines 

가장 저렴한 비용 또는 가장 좋은 경과 시간이있는 계획의 기준선을 고려하십시오. 옵티마이 저가 가장 저렴한 비용의 플랜을 선택하지만 고정 플랜을 선호합니다. 이것은 계획에 대한 힌트와 SQL 프로파일이 무엇인지에 관계없이 CBO가 계획을 사용하도록 보장하는 가장 좋은 방법입니다.

기준선을로드 한 다음 dba_sql_plan_baselines보기에서 SQL 핸들을 가져옵니다. 더 계획이 가능하게 될 계획

SET LONG 10000 
SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SQL_handle_xxxxxx') FROM dual; 

var report clob; 
exec :report := dbms_spm.evolve_sql_plan_baseline(); 
print :report 

진화에만 작동합니다 :

시도는 사용 진화. 때로는

당신은 예를 들어,이 기준을 강제로 수정해야합니다

SET SERVEROUTPUT ON 
DECLARE 
    l_plans_altered PLS_INTEGER; 
BEGIN 
    l_plans_altered := DBMS_SPM.alter_sql_plan_baseline(
    sql_handle  => 'SQL_handle_xxxxxx', 
    plan_name  => 'SQL_PLAN_xxxxxxx', 
    attribute_name => 'fixed', 
    attribute_value => 'YES'); 
    DBMS_OUTPUT.put_line('Plans Altered: ' || l_plans_altered); 
END; 
/

보통 계획이 즉시 사용되지 않고 시도하고 강제하기위한 다양한 방법이 있습니다 ...

하나는 실행 가능한 경우 해당 명령문을 실행하는 모든 세션을 종료하는 것입니다.

또한 테이블을 사용하여 커서를 무효화 할 수 있습니다

begin 
    dbms_stats.gather_table_stats(ownname=> '<schema>', 
    tabname=> '<table>', no_invalidate => FALSE); 
end; 

분석을 또한 커서를 무효화 기존의 방법을 사용!

SQL> analyze table <table> estimate statistics sample 1 percent; 

확인하려면 이벤트의

SQL> select child_number, executions, parse_calls, loads, invalidations 
    from v$sql where sql_id = '<SQLID>'; 

순서 :

  1. 잠금 사용자
  2. 을 무효화 모든 세션이 해당 사용자
  3. 로 로그인 커서
  4. 킬을
  5. 는 사용자에게
  6. 확인을 다시
의 잠금을 해제