一直对v$sql里的extract_matching_signature与force_matching_signature理解不是很好理解,今天就自已手动操作理解一下。可能有些东西理解错了,希望大家指出,谢谢!
exact_matching_signature : 对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不包括字符常量)后,如果 SQL相同,那么SQL语句的exact_matching_signature就是相同的
force_matching_signature :
对SQL语句,去掉重复的空格(不包括字符常量),将大小写 转换成相同,比如均为大写(不包括字符常量),然后去掉SQL中的常量,如果SQL相同,那么SQL语句的 force_matching_signature就是相同的。
理解:
把大小写换成相同、去掉重复空格的sql , 生成exact_matching_signature 值。如果sql相同,
exact_matching_signature 相同
把大小写换成相同、去掉重复空格的、常量去掉的sql , 生成的force_matching_signature 值。如果sql相同,force_matching_signature相同。
-------------------------------------------------------------------------------------------------------------------------------
sql exact_matching_signature force_matching_signature
select 1 from a where a=1 select 1 from a where a=1select 1 from a where a=
select 1 from a where a=2 select 1 from a where a=2select 1 from a where a=
select 1 from a where a=$a select 1 from a where a=$aselect 1 from a where a=$a
所以
当sql的exact_matching_signature != force_matching_signature 是常量
当sql的exact_matching_signature = force_matching_signature 是绑定变量
e.g : 运行以下三句话
1、select * from qn where qn = 2
2、select * from qn where qn = 3
3、select * from qn where qn = 4
4、var a number ;
exec:a:=2;
select * from qn where qn :=a;
得出结果:
SQL> select sql_text ,sql_id ,exact_matching_signature,force_matching_signature from v$sql where sql_text like 'select * from qn where qn%' ;
SQL_TEXT SQL_ID EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE
----------------------------------- -------------------------- -------------------------------------- --------------------------------------
select * from qn where qn = 3 fra23zt3swas9 4687974134679845652 1883240159772388027
select * from qn where qn = 2 f843wpp30tqu2 11642415946286633796 1883240159772388027
select * from qn where qn = 4 cb58443fj9sx0 11673520259659889340 1883240159772388027
select * from qn where qn = :a 1kyu6y4t0rkq1 5895873948142166777 5895873948142166777
结论:
非绑定变量的sql :
非绑定变量的sql ,sql_id不一样, exact_matching_signature 值也不一样。 force_matching_signature 值是相同。
通过 force_matching_signature 可以找到相同的语句的非绑定变量的sql。
非绑定变量sql exact_matching_signature != force_matching_signature
绑定变量的sql :
绑定变量的sql的exact_matching_signature,force_matching_signature 与 非绑定变量的sql不一样。
绑定变量的exact_matching_signature = force_matching_signature