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