Oracle veritabanlarında sql plan fix işlemi
Oracle veritabanlarında bazı durumlarda optimizer’ların doğru karar veremeyişinden kaynaklı , sorguların kötü planlarla çalışması durumu yaşanabilir. Daha iyi bir plan varsa , sorgunun bu planla çalışması için sabitleme gerekebilir. Aşağıdakai adımları izleyerek bir sorgunun planı sabitlenebilir. Diğer bir deyişle plan fix işlemi yapılabilir.
Öncelikle veritabanında aşağıdaki parametrelerin değerlerinin belirtildiği gibi olduğunu kontrol edin.
OPTIMIZER_USE_SQL_PLAN_BASELINES = TRUE
OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES = FALSE
Parametreler bu şekilde değilse , değiştirin. Sonrasında aşağıdaki sorgu ile sql_id bilgisi ile ilgili sorgunun planlarını kontrol edin.
select inst_id, address, hash_value, sql_id, plan_hash_value, operation, optimizer, cost from gv$sql_plan where id = 0 and sql_id = 'XXXXXXXXXXX';
Sonrasında aşağıdaki pl/sql bloğu ile ilgili sql cümleciğinin cursır cache’de varolan planının yüklenmesini sağlayalım.
declare my_plans pls_integer; begin my_plans := dbms_spm.load_plans_from_cursor_cache(sql_id => 'XXXXXXXXXXX', plan_hash_value => 'XXXXX', fixed => 'NO'); end;
ya da
declare my_plans pls_integer; begin my_plans := dbms_spm.load_plans_from_cursor_cache(sql_id => 'XXXXXXXXXXX'); end;
Sonrasında oluşturulan sql baseline bilgilerinden sql_handle ve plan_name bilgilerini , aşağıdaki sorgu ile tespit edelim.
select * from dba_sql_plan_baselines;
Yukarıdaki sorgudan dönen sql_handle ve plan_name bilgileri ile sorgumuzun planını aşağıdaki pl/sqlbloğu ile sabitleyelim.
DECLARE l_plans_altered PLS_INTEGER; BEGIN l_plans_altered := DBMS_SPM.alter_sql_plan_baseline(sql_handle => 'SQL_aaa4f03be3519ae5', plan_name => 'SQL_PLAN_ap97h7gjp36r5e4cd1512', attribute_name => 'fixed', attribute_value => 'YES'); DBMS_OUTPUT.put_line('Plan sabitlendi : ' || l_plans_altered); END; /
Aşağıdaki gibi oluşturulan sql baseline’ı silebilirsiniz.
DECLARE l_plans_dropped PLS_INTEGER; BEGIN l_plans_dropped := DBMS_SPM.drop_sql_plan_baseline (sql_handle => 'SQL_aaa4f03be3519ae5',plan_name => 'SQL_PLAN_ap97h7gjp36r5e4cd1512'); DBMS_OUTPUT.put_line('Plans Dropped: ' || l_plans_dropped); END; /