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; /
![]()
