Oracle veritabanlarında sql plan fix işlemi

7 Kas by Ahmet Duruöz

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; /

 

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir