Pages

27 Nisan 2012 Cuma

EXACT_MATCHING_SIGNATURE ve FORCE_MATCHING_SIGNATURE hakkında


Oracle dökümanlarında EXACT_MATCHING_SIGNATURE normalize SQL textinde hesaplanan imzadır şeklinde tanımlanmıştır. Buradaki normalizasyon kavramı beyaz alanların çıkarılması ve gerçek olmayan tüm stringlerin büyük harfe dönüştürülmesidir. CURSOR_SHARING parametresi EXACT olarak ayarlandığında bu imza kullanılırken, FORCE_MATCHING_SIGNATURE kolon değeri ise CURSOR_SHARING parametresi FORCE olarak ayarlandığında Oracle’ın hesapladığı imzadır.  

Şimdi bu kolonların alacağı bazı değerleri ve bunların anlamlarını aşağıda inceleyelim.  

I. SENARYO:

EXACT_MATCHING_SIGNATURE  ve FORCE_MATCHING_SIGNATURE değerleri sıfır olarak ayarlanmıştır. Bu senaryo eğer komut tipi PL/SQL paketi, INSERT,ALTER INDEX,LOCK, SET ROLE ve mevcut SYS tablolarından($,# olanlar, ancak görünümler hariç) SELECT/UPDATE işlemleri  veya dahili Oracle komutları içindir.  Bunun yanında daha fazla komut olabilir, ancak Oracle SQL in yeniden kullanılamayacağını düşünecek ve ardından değerleri 0 olarak işaretleyecektir.

Aşağıdaki örnekte bir test tablosuna sahte(dummy) değerler giriyorum ve ardından EXACT_MATCHING_SIGNATURE  ve FORCE_MATCHING_SIGNATURE için kolon değerlerini kontrol ediyorum.  

SQL>create table test (col1 number, col2 number);
Table created.

SQL>insert into test values (1,1);
1 row created.

SQL>insert into test values (2,2);
1 row created.

SQL>insert into test values (3,3);
1 row created.

SQL>commit;

SQL>select sql_id, sql_text from v$sql where sql_text like ‘insert%test%’;

SQL_ID          SQL_TEXT
-------------   ----------------------------
4tdr62wtgx7ls   insert into test values (3,3)
3283yg26ref6h   insert into test values (1,1)
2rdxtrdc6ztdf   insert into test values (2,2)

Aşağıdaki sorgu EXACT_MATCHING_SIGNATURE ve FORCE_MATCHING_SIGNATURE  için kolon değerlerini kontrol etmektedir. Üste belirttiğim gibi bu değerlerin 0 olması gerekmektedir.   

SQL>SELECT sql_id, exact_matching_signature, force_matching_signature from v$sql where sql_id=’4tdr62wtgx7ls’;


SQL_ID         EXACT_MATCHING_SIGNATURE   FORCE_MATCHING_SIGNATURE
-------------  ------------------------   ----------------------
4tdr62wtgx7ls   0                         0


II. SENARYO:

EXACT_MATCHING_SIGNATURE=FORCE_MATCHING_SIGNATURE. Bu senaryo bind değişkenlerinin kullanıldığı durumlarda kullanılmaktadır.

Bu senaryonun örneğinin amacı, bind değişkeni kullanıldığında  EXACT_MATCHING_SIGNATURE  değerinin FORCE_MATCHING_SIGNATURE değerine eşit olduğunu kanıtlamaktır. Bunu elde etmek için, OBJ_ID adında bir değişken tanımlıyorum ve farklı oturumlardan farklı değerlerde OBJ_ID kullanarak birçok kez SELECT sorgusu alıyorum.

SQL>column EXACT_MATCHING_SIGNATURE format 99999999999999999999999999999999999999999999999
SQL>column FORCE_MATCHING_SIGNATURE format 99999999999999999999999999999999999999999999999

SQL>VARIABLE OBJ_ID NUMBER;
SQL>EXEC : OBJ_ID:=073534;

SQL>SELECT /* With Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=:OBJ_ID;

OBJECT_NAME    
---------------------
DBA_HIST_LIBRARYCACHE

SQL>EXEC :OBJ_ID:=345348
PL/SQL procedure successfully completed.

SQL>SELECT /* With Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=:OBJ_ID;

OBJECT_NAME         
---------------------
DBA_HIST_LIBRARYCACHE

SQL>EXEC :OBJ_ID:=073532
PL/SQL procedure successfully completed.

SQL>SELECT /* With Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=:OBJ_ID;

OBJECT_NAME    
---------------------
DBA_HIST_LIBRARYCACHE

Aşağıdaki sorgu EXACT_MATCHING_SIGNATURE ve FORCE_MATCHING_SIGNATURE için kolon değerlerinin bind değişken kullanıldığından dolayı aynı olduğunu göstermektedir.

SQL>SELECT sql_id, executions, exact_matching_signature, force_matching_signature from v$sql where sql_id=’drf4r1g5qhrs8′;

SQL_ID        EXECUTIONS                        EXACT_MATCHING_SIGNATURE                          FORCE_MATCHING_SIGNATURE
-------  ------------  -------------------- --------------------
drf4r1g5qhrs8          3                               7984808275468932365                               7984808275468932365


III. SENARYO:

EXACT_MATCHING_SIGNATURE ve FORCE_MATCHING_SIGNATURE değerlerinin birbirinden farklı olduğu durum. Bu senaryo, SQl komutunda farklı literallerin kullanıldığı durumdur. SQL komutu CURSOR_SHARING parametre değeri FORCE olduğunda paylaşılacaktır.

Bu örneğin amacı; bind değişkenler kullanılmadığında EXACT_MATCHING_SIGNATURE değerinin  FORCE_MATCHING_SIGNATURE  değerine eşit olmadığını göstermektir. Bunu elde etmek için, farklı literal değerler ile birçok kez aynı SQL komutunu çalıştırıyorum.

Please note that I have NOT set CURSOR_SHARING to FORCE.

SQL>SELECT /* Without Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=073535;

OBJECT_NAME
--------------------
DBA_HIST_LATCH_PARENT

SQL>SELECT /* Without Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=073538;

OBJECT_NAME
----------------------
DBA_HIST_LATCH_MISSES_SUMMARY

SQL>SELECT /* Without Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=073534;

OBJECT_NAME
---------------------
DBA_HIST_LIBRARYCACHE

SQL>SELECT /* Without Bind Value */ OBJECT_NAME FROM MYOBJECTS WHERE OBJECT_ID=073530;

OBJECT_NAME
---------------------
DBA_HIST_LIBRARYCACHE

Aşağıdaki sorgu EXACT_MATCHING_SIGNATURE ve FORCE_MATCHING_SIGNATURE için kolon değerlerinin bind değişken olmaksızın farklı literal değerler kulalnıldığından dolayı farklı olduğunu göstermektedir.

SQL> SELECT SQL_ID, SQL_TEXT, EXACT_MATCHING_SIGNATURE,FORCE_MATCHING_SIGNATURE FROM V$SQL WHERE SQL_TEXT LIKE ‘%Without Bind Value%’;

SQL_ID        SQL_TEXT                                            EXACT_MATCHING_SIGNATURE          FORCE_MATCHING_SIGNATURE
-------   ---------- --------------- ----------------------
4rgh63hsg30tf SELECT /* Without Bind Value */                         35481458635320564024              32512835381060113442
OBJECT_NAME FROM MYOBJECTS WHERE
OBJECT_ID=073535

7ykcv2wwz1brd SELECT /* Without Bind Value */                          62398003617908267518              32512835381060113442
OBJECT_NAME FROM MYOBJECTS WHERE
OBJECT_ID=073534

fb40628bj9kl5 SELECT /* Without Bind Value */                           44792845587509047365              32512835381060113442
OBJECT_NAME FROM MYOBJECTS WHERE
OBJECT_ID=073530


SQL>SELECT SQL_ID FROM V$SQL WHERE FORCE_MATCHING_SIGNATURE=32512835381060113442;

SQL_ID
--------------
4rgh63hsg30tf
7ykcv2wwz1brd
fb40628bj9kl5

Bu kolonlar ne kadar kullanışlıdır?

1. Özdeş olan ancak bind değişken kullanmayan SQL komutlarını bulmak için kullanışlıdır. 10g öncesinde bu sonuç setini almak için kesin bir yol yoktu. 10g itibariyle aşağıdaki sorguyu çalıştırmak yeterli olacaktır.

SQL>column FORCE_MATCHING_SIGNATURE format 99999999999999999999999999999999999999999
SELECT SQL_ID , SQL_TEXT, force_matching_signature FROM V$SQL WHERE force_matching_signature IN (SELECT force_matching_signature
FROM v$sql
WHERE force_matching_signature <> 0
AND force_matching_signature <> exact_matching_signature
GROUP BY force_matching_signature
HAVING COUNT(*) > 1)
ORDER BY 3;

2.  Bu kolon CURSOR_SHARING parametresi FORCE olarak ayarlanmış sistemlerde SQL komutlarının yeniden kullanılıp kullanılmadığını kontrol etmek içinde oldukça kullanışlıdır. 

0 yorum:

Yorum Gönder