SQL Profile bir SQL ifade için nasıl çalışacağına dair oluşturulan bir modeldir. Normal durumda bir sql çalışcağı zaman optimizer tablo, index istatistiklerinden aldığı bilgiyle çalışacak olan sql için cardinality, selectivity ve cost değerlerini kontrol eder buradan sql için en uygun gördüğü çalışma planını kullanır. Fakat bazen istatistilerin güncel olmaması, tablonun üzerindeki transaction ve DML işlemlerinin çok fazla olması gibi nedenlerden optimizer yanlış cost hesaplayabilir ve yanlış plan seçerek sorgunun kötü çalışmasına neden olabilir. Bu durumlarda Sql profile oluşturularak sql’in doğru plandan çalışması sağlanabilir.
Sql Profile oluşturulurken automatic tuning optimizer ilk satırdan son satıra kadar tüm olası sql durumlarına bakar ve sql profile bir kez kabul edildikten sonra o sql ifade için data dictionary de saklanacaktır, ta ki biz bu sql profile silene kadar. Sql profile kabul edildikten sonra optimizer istatistik bilgilerinin yanında sql profile bilgisinide kullanarak yürütme planı çıkaracaktır. Sql profile içerisine herhangi bir sql planı (plan hash value) force yapabiliriz bu şekilde de sql plan fix işlemleri gerçekleştirebiliriz.
Sql profile için DBA_SQL_PROFILES data dictionary tablosundan sorgulayabiliriz.
SQL> select name,status,sql_text,force_matching from dba_sql_profiles;
NAME STATUS SQL_TEXT FOR
------------------------------ -------- -------------------------------------------------------------------------------- ---
coe_gnjmz1udfd9cg_1014706028 ENABLED UPDATE TBL_ALARM_STATUS SET END_DATE = :B2 WHERE INVERTER_ID = :B1 AND ERROR_NUM YES
şu an veritabanında oluşturulmuş bir sql profile var, yukarıda hangi sql için profile oluşturulmuş görüyoruz aynı zamanda force_matching enable yapılmış yani burada plan bir plan_hash_value değerine fix yapılmış.
DISABLE SQL PROFILE
BEGIN
DBMS_SQLTUNE.ALTER_SQL_PROFILE(
name => 'coe_gnjmz1udfd9cg_1014706028',
attribute_name => 'STATUS',
value => 'DISABLED');
END;
/
SQL> select name,status,sql_text,force_matching from dba_sql_profiles;
NAME STATUS SQL_TEXT FOR
------------------------------ -------- -------------------------------------------------------------------------------- ---
coe_gnjmz1udfd9cg_1014706028 DISABLED UPDATE TBL_ALARM_STATUS SET END_DATE = :B2 WHERE INVERTER_ID = :B1 AND ERROR_NUM YES
DROP SQL PROFILE
BEGIN
DBMS_SQLTUNE.DROP_SQL_PROFILE ('coe_gnjmz1udfd9cg_1014706028');
END;
/
SQL PROFILE İçeriğini Görmek için;
SELECT CREATED, PROFILE_NAME, SQL_TEXT,
extractvalue(VALUE(hint), '.') AS hint
FROM DBMSHSXP_SQL_PROFILE_ATTR h, DBA_SQL_PROFILES p, TABLE(xmlsequence(extract(xmltype(h.comp_data), '/outline_data/hint'))) hint
WHERE p.name = h.profile_name;
SQL Profile ile fix işlemi için https://carlos-sierra.net/ coe_xfr_sql_profile.sql sql ifadesi kullanılabilir.
Bir yanıt yazın