18 Ağustos 2010 Çarşamba

SQL Profilleri / Otomatik SQL Tuning

Merhaba,

Oracle veritabanındaki SQL profilleri otomatik SQL tuning işlemi ile ayarlanmakta iken bu profilleri DBMS_SQLTUNE ile yönetebiliriz. DBMS_SQLTUNE Oracle içine gömülü bir pakettir.

SQL tuning advisor bize bir SQL profili kullanmamızı istediği, daha doğrusu tavsiye ettiği zaman bunu kabul edebiliriz. Bu advisor hem index hem de sql profil kullanımını bir arada tavsiye edebilir ve bu durumda ikisinin birden kullanılması iyidir. Unutmadan, SQL tuning advisor'ın tavsiye ettiği verileri "Enterprise Manager" konsolundan inceleyebilirsiniz.

DECLARE my_sqlprofile_name VARCHAR2(30);
BEGIN my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (task_name => 'my_sql_tuning_task', name => 'my_sql_profile', force_match => TRUE);
END;

Buradaki "my_sql_profile" kabul etmek istediğimiz SQL profilinin adıdır. my_sql_tuning_task ise SQL tuning görevinin adıdır.

Genel olarak kabul edilmiş bir SQL profili SQL cümlesi ile SQL imzası aracılığı ile birleştirilir. Bu birleştirme işleminde hash (yığın) fonksiyonu kullanılır. Bu hash fonksiyonu SQL cümlesinin tamamını büyük harfe çevirir ve bütün boşlukları silerek, bir imza oluşturulmadan önce tasarlar. Ortak olarak kabul edilen bütün SQL cümleleri için bu SQL profili kullanılabilir.

force_match özelliğini "true" olarak ayarladığımız zaman, SQL cümlesi içerisindeki bütün literal ve bind değerleri normalize edilir. Bu durumda SQL profili yaratılmış olan SQL cümlemiz içerisinde yer alan bind değerleri de gözardı edilmeden, yarattığımız SQL profilini, ilgili SQL cümleciğimiz içim kullanabiliriz. force_match false olarak bırakılırsa ki bu varsayılanıdır ve aksini söylemedikçe true olarak değer kazanmaz, bu durumda literal değerler normalize edilemez.

SQL profilleri ile ilgili değerleri öğrenmek ve profilleri takip etmek için DBA_SQL_PROFILES data dictionary görüntüsünü incelemeniz gerekmektedir.

ALTER komutu ile daha önceden yaratılmış bir SQL profilini değiştirebiliriz;

BEGIN
DBMS_SQLTUNE.ALTER_SQL_PROFILE(name => 'my_sql_profile', attribute_name => 'STATUS', value => 'DISABLED');
END;
/

DROP komutu ile de yarattığımız bir SQL profilini düşürebiliriz;

BEGIN
DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'my_sql_profile');
END;
/

Normal şartlar altında bir SQL profili yaratılmasının gerektiğini düşünmüyorum ancak 10g ve sonrası için satın alınan ve diagnostic pack ile gelen AWR'ın sunduğu ADDM bilgileri içerisinde bu talepleri de bulmanız mümkün. Ben genelde ADDM tavsiye ettiği zaman bir SQL profili yaratıyorum ve bununla birlikte indeks önerisi gelirse de dikkate alıyorum. Bunun yanında SQL Tuning Advisor otomatik olarak AWR yüksek yüklenen SQL cümleleri üzerinde çalıştırılmaktadır. Bir anlamda kombinasyonu sağlanarak ADDM üzerinde de SQL profilleri ve indekslemeler tavsiye edilmektedir.

SQL Tuning Advisor'ın çalıştırılması ise kapatılabilir veya yeniden açılabilir;

BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/


DBMS_AUTO_TASK_ADMIN package:BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/

11g veritabanı ile birlikte SQL Tuning Advisor otomatik olarak, belirli zamanlarda çalıştırılmaktadır. Bu çalıştırmalar zamanında yüksek yüklü SQL cümleleri üzerinde, nasıl bir tuning yapılacağı tavsiyesi hazırlanmaktadır. Daha önce de bahsettiğim gibi, en iyi gözlemleme ve kontrol etme yöntemi enterprise manager'ı kullanmaktır.

İyi çalışmalar.

Ogan

Hiç yorum yok:

Takip et: @oganozdogan