
SQl Plan Fix işlemi ve Planlar ile ilgili detaylı bilgiyi bundan önceki iki yazımızda belirtmiştik aşapıdaki linklerden bu yazılara ulaşabilirsiniz;
Buradaki yöntemde ise sql planın outline ifadesi kullanılarak, başka bir sql id için fix yapılır bunu göreceğiz , çok yaygın kullanılan bir yöntem olmamasına karşın, bazı durumlarda gerekmektedir, örneğin bir sql in yapısı değişmemesine karşın, sql_id değişirse , farklı bir database taşınması durumularında, bu durum olabilir, bu durumda eski veritabanında ilgli sql in outline ifadesi alınarak yeni veritabanındaki sql e outline fix işlemi uygulanabilmektedir. Aşağıda bu işlemin nasıl yapıldığına dair bir örnek işlem verilmiştir.
SQL OUTLINE ÇIKARMA
cursor daki planlardan outline çıkarmak için v$sql_plan view ı kullanılarken historical tablolardan sql outline çıkarmak için dba_hist_sql_plan tablosu kullanılır
select CHR(9)||''''
||regexp_replace(extractvalue(value(d),'/hint'),'''','''''')
|| ''','
from xmltable('/*/outline_data/hint'
passing (select xmltype(other_xml) as xmlval
from v$sql_plan
where sql_id = 'amu9ma9thgy7t'
and plan_hash_value=257809876
and CHILD_NUMBER = 0
and other_xml is not null)) d;
select CHR(9)||''''
||regexp_replace(extractvalue(value(d),'/hint'),'''','''''')
|| ''','
from xmltable('/*/outline_data/hint'
passing (select xmltype(other_xml) as xmlval
from dba_hist_sql_plan
where sql_id = 'amu9ma9thgy7t'
and plan_hash_value=257809876
-- and CHILD_NUMBER = 0
and other_xml is not null)) d;
OUTLINE SET
Aşağıdaki plsql code bloğunda istediğimiz sql_id outline alınır ve kötü plandan çalışan sql_id nin plan olarak uygulanır. Yani aşağıdaki ifadede kötü sql id ve plan hash verilirken, iyi olan sql planın outline ifadesi alınarak sqlprof_attr içerisine verilmiştir.
declare
ar_profile_hints sys.sqlprof_attr;
begin
ar_profile_hints := sys.sqlprof_attr(
'BEGIN_OUTLINE_DATA',
'IGNORE_OPTIM_EMBEDDED_HINTS',
'OPTIMIZER_FEATURES_ENABLE(''11.2.0.4'')',
'DB_VERSION(''11.2.0.4'')',
HASH)',
'PQ_DISTRIBUTE(@"SEL$F908C067" "PRODUCT"@"SEL$11" HASH HASH)',
..... Log Outline Deleted .....
'END_OUTLINE_DATA');
for sql_rec in (
select t.sql_id, t.sql_text
from dba_hist_sqltext t, dba_hist_sql_plan p
where t.sql_id = p.sql_id
and p.sql_id = 'cxugb2t83v033'
and p.plan_hash_value = 175405248
and p.parent_id is null
)
loop
DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
sql_text => sql_rec.sql_text,
profile => ar_profile_hints,
name => 'MK_PROFILE_cxugb2t83v033',
force_match => true);
end loop;
end;
/
Bir yanıt yazın