Press ESC to close

SQL PLAN FIX -3 (OUTLINE)

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

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