">

Sql plan fix

Sql plan fix

Merhaba Arkadaşlar,

Sql plan nasıl fixed edilir bunu anlatmaya çalışacağım.

öncelikle aşağıdaki parametereler kontrol edilir ve aşağıdaki gibi set edilir.

select * from v$parameter where upper(name)='OPTIMIZER_USE_SQL_PLAN_BASELINES';
select * from v$parameter where upper(name)='OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES';
--alter system set OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES= FALSE
--alter system set OPTIMIZER_USE_SQL_PLAN_BASELINES=TRUE;

Aşağıdaki sql ile ilgili sql_idnin sql_plan bilgilerini görebilirsiniz.

select inst_id,
       address,
       hash_value,
       sql_id,
       plan_hash_value,
       operation,
       optimizer,
       cost
  from gv$sql_plan
 where id = 0
   and sql_id = 'cq7ccsusjxrh6';

select * from gv$sql_plan where sql_id='cq7ccsusjxrh6' and id=0;

Aşağıdaki plsql blok'u ile sql plan set ederiz.

declare
  my_plans pls_integer;
begin
  --my_plans := dbms_spm.load_plans_from_cursor_cache(sql_id          => '1svhsp4ksx215',
    --                                                    plan_hash_value => '630097957',
      --                                                  fixed           => 'NO');
  my_plans := dbms_spm.load_plans_from_cursor_cache(sql_id => 'cq7ccsusjxrh6');
end;

Aşağıdaki sql ile set ettiğimiz planın sql_handle,plan_name lerini bi kenara aldıktan sonra.


select * from dba_sql_plan_baselines;

Aşğaıdaki sql ile planı fixed ederiz.

DECLARE
  l_plans_altered PLS_INTEGER;
BEGIN
  l_plans_altered := DBMS_SPM.alter_sql_plan_baseline(sql_handle      => 'SQL_ee4175502f488930',
                                                      plan_name       => 'SQL_PLAN_fwhbpa0rnj29hc6573452',
                                                      attribute_name  => 'fixed', --enabled, fixed, autopurge, plan_name, description
                                                      attribute_value => 'NO');
  DBMS_OUTPUT.put_line('Plans Altered: ' || l_plans_altered);
END;
/

Eğer fixlediğimiz planı silmek istesek;

select ADDRESS, HASH_VALUE from V$SQLAREA where SQL_ID like 'cq7ccsusjxrh6';
exec sys.DBMS_SHARED_POOL.PURGE ('00000000B4F3CD70,2971590150', 'C');

NOT: Eğer tüm planları temizlemek isterseniz aşağıdaki komutu kullanabilirsiniz ama tavsiye edilmez çünkü tüm sl planları temizlemek demek tüm sqllerin tekrardan hard parse edilmesi demek bud ciddi bir maliyettir gerçekten ihtiyaç yok ise çalıştırılmamalı.

alter system flush shared_pool;

Umarım faydali olmuştur.

Yorumlar

  1. ali rıza yilmaz

    Teşekkürler hocam. Elinize sağlık güzel bir makale olmuş. Çok işime yaradığını söyleyebilirim. Gayet yalın ve anlasılır bir dil kullandıgınız içinde ayrıca teşekkürler.

Yorum Yapın