Pages

23 Eylül 2011 Cuma

10g sürümden 11g sürüme yükseltmede SQL çalıştırma planlarında kesintisiz performansın sağlanması

Pek çok DBA in ve PL/SQL geliştiricininde bildiği üzere, veritabanında bir parametre değişikliği tüm veritabanı çapında etkin olmaktadır. Bu durum,  SQL komutlarında kullanılan bir “hint” in, outline nın veya obje güncellemesini kapsayacak istatistikleri etkileyen SQL profilinin tam tersidir.

DBA’in veritabanını 10g sürümlerden 11g sürüme yükseltmesinde beklentilerinden birisi, yükseltme sonundaki platformda 10g deki çalıştırma plan varsayılan ayarlarının muhafaza edilmesidir. Ancak bu, 11g ortamında masum bir beklenti olarak kalacaktır!

Değişikliklerden geri dönülmesi  ve/veya daha önceki sürümlerdeki herhangi bir değişikliğin kaldırılması performansı oldukça etkileyebilecektir. Bu yüzden 10g performans baseline’larını  11g de de aynen alıkoyma fırsatı mümkün olursa, bu durum yükseltme sonunda çalıştırma planı maliyeti ile ilişkili karşılaşılacak sorunlar noktasında en önemli kurtarıcı olacaktır. Bu noktada “10g planları 11g planlarından dahamı iyidir” sorusu kafa karıştırıcı olacaktır. Elbette böyle bir iddia %100 kanıtlanır olmasada, 11g deki pek çok “gizli” parametrenin 10g deki değerlerinden oldukça farklı olması sebebiyle SQL çalıştırma planı performanslarında gerçekten dramatik düşüşler olabilecektedir. Aslında 10g öncesi 9i platformundan yükseltmelerde bu tür sıkıntılar mevcuttu, ancak 11g deki performans kaybı daha önceki sürüm yükseltmelerinden daha dramatik olmaktadır. Bu tür 11g sürümüne yükseltme sonrası çalıştırma planı performans problemlerinin detaylı analizlerine ve teknik incelemelerine, Coşkan Gündoğar'ın aşağıdaki yazı dizilerinden erişebilirsiniz, bu dizilerde oldukça faydalı analizler sebepleriyle beraber yer almaktadır.


İşte bu tür parametrelerin varsayılan ayarlarındaki bariz değişiklikler yüzünden meydana gelebilecek sıkıntılı durumlarda, DBA lere hızlıca performans iyileştirme imkanı vermek ve aslında 10g deki SQL profillerinde uzun çabalar sonunda erişilen gelişmiş çalıştırma planı performansının 11g’de de aynen devam etmesini sağlamanın en iyi metotlardan birisi; 10g çalıştırma planlarının baseline koleksiyonunu dışarı almak ve sistem 11g sürümüne yükseltildiğinde bu koleksiyonun 11g SQL Plan Baseline içerisine yüklenmesi olmaktadır.
Bu işlem için izlenmesi gereken adımlar aşağıda yer almaktadır;

1.    Oracle 10g veritabanında bir SQL set oluşturulmalıdır.

SQL>  BEGIN
DBMS_SQLTUNE.CREATE_SQLSET(
sqlset_name => ’11G_PLAN_UPGRADE’);
END;
/

2.    Veritabanı kullanımı anlamına gelecek belirli bir zaman periyodundaki  çalıştırma planlarının toplanması gerekmektedir. Bu noktada bu sorgunun ne kadar zaman çalışacağının bir anlamı yoktur(aşağıda 5 dakika olarak belirtilen kısım). Bu işlem kursör önbelleği içinden basit bir veri toplama olayıdır.

SQL> EXEC DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET( -
sqlset_name => ’11G_PLAN_UPGRADE’, -
time_limit => 480, -
repeat_interval => 5);

3.    Yukardaki işlem sona erdiğinde plan sayısı kontrol edilmelidir.

SQL> select owner,name, STATEMENT_COUNT from DBA_SQLSET;

OWNER NAME STATEMENT         COUNT
----------- ---------------   -------
SYS         11G_PLAN_UPGRADE  122

SQL> select SQL_ID,SQL_TEXT from DBA_SQLSET_STATEMENTS;

4.    Yükseltme esnasında planları tutmak  için aşağıdaki gibi bir tablo oluşturulacak ve paketlenecektir.

BEGIN
DBMS_SQLTUNE.CREATE_STGTAB_SQLSET(
table_name => ‘10G_TO_11G_TBL’
);
DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
sqlset_name => ’11G_PLAN_UPGRADE’
,sqlset_owner => ‘SYS’
,staging_table_name => ‘10G_TO_11G_T’
,staging_schema_owner => ‘SYS’
);
END;
/

BEGIN
DBMS_SQLTUNE.PACK_STGTAB_SQLSET(
sqlset_name => ’10G_TO_11G’
,sqlset_owner => ‘SYS’
,staging_table_name => ‘10G_TO_11G_TBL’
,staging_schema_owner => ‘SYS’
);
END;
/

PL/SQL procedure successfully completed.

Bu adım sonunda yükseltme öncesi toplama adımları tamamlanmış olacaktır.

5.    11g yükseltme işlemi yapıldıktan sonra, 10g veritabanındaki çalıştırma planlarına direkt olarak dönebilmek için SQL Baseline’lar uygulanabilir. Bu noktada, aşağıdaki adımları izleyerek 10g çalıştırma planları 11g SQL plan baseline’ları içine alınabilir.

DECLARE from_10g_plans pls_integer;
BEGIN
DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(
sqlset_name => ’10G_TO_11G’
,sqlset_owner => ‘%’
,replace => TRUE
,staging_table_name => ‘10G_TO_11G_TBL’);

from_10g_plans := DBMS_SPM.LOAD_PLANS_FROM_SQLSET(
sqlset_name => ’10G_TO_11G’
,sqlset_owner => ‘SYS’,basic_filter => ‘sql_text like ”%”’
,fixed => ‘YES’,enabled => ‘YES’
,commit_rows => 1);
END;
/
Bu işlem sonunda 10g sürümden 11g sürüme yükseltme işleminde çalıştırma planlarında sürekli  bir performans garantisi yetisine kavuşulacaktır.

0 yorum:

Yorum Gönder