V$SQL视图中有两个字段exact_matching_signature与force_matching_signature。
它们也是sql的一种标识符, exact_matching_signature为精确匹配标识符,force_matching_signature为强制匹配标识符。
怎么理解这两个标识符的概念呢,下面举例进行说明:
我们观察一下下面的几条sql语句的不同。
(1) select * from t1 where temporary=‘N’;
(2) select * from t1 where temporary=‘Y’;
(3) SELECT * FROM T1 WHERE TEMPORARY =‘Y’;
(4) select * from t1 where temporary=:b;
(5) SELECT * FROM T1 WHERE TEMPORARY=:B;
(6)select * from t1 where temporary=:b and status=‘VALID’;
(7)select * from t1 where temporary=:b and status=‘INVALID’;
可以看出(1)与(2)过滤条件中常量值不同,(2)与(3)大小写不同,并且(3)中有多余重复空格;(4)与(5)都使用了绑定变量,但是存在大小写不同,并且(5)中有多余重复空格;(6)与(7)使用绑定变量与常量组合过滤,过滤条件常量值不同。
我们加上注释/*yuzj*/执行,方便查询。
查询SQL语句的signature相关属性,结果如下:
从结果可以看出:
(1)(2)(3)force_matching_signature相同,(2)(3)的exact_matching_signature相同,这说明对于sql语句,大小写写法不同或存在多余重复空格的情况,其语义是相同的,则exact_matching_signature就是相同的,使用常量值来过滤,过滤值不同,exact_matching_signature不同,但是force_matching_signature是相同的,这说明force_matching_signature忽略了过滤常量值的不同,把这类sql当成是同一种sql语句。
(4)和(5)具有相同的exact_matching_signature和force_matching_signature,并且sql本身的exact_matching_signature和force_matching_signature也相同;(6)和(7)exact_matching_signature和force_matching_signature都不同,但sql本身的exact_matching_signature和force_matching_signature相同。这说明只要使用绑定变量,exact_matching_signature和force_matching_signature标识符的生成规则就是相同的,可以把它当成都是符合精确匹配原则,只忽略大小写写法不同或存在多余重复空格的情况。从这个特点我们可以得出一个规律,如果sql的force_matching_signature与exact_matching_signature不同,肯定没有使用绑定变量。
上面的结论是在cursor_sharing=EXACT得出的。
当cursor_sharing=FORCE时,所有sql都相当于使用了绑定变量,sql本身exact_matching_signature与force_matching_signature都相同。
补充两点
1.sql语句中使用“--”符号注释时,会导致语句自身exact_matching_signature与force_matching_signature相同,不同过滤条件值的语句的force_matching_signature也不同。
2.存储过程或plsql块中的sql语句的两个签名值都是0。
什么时候会用到这个知识点?
在对sql固定执行计划时,有一个参数叫force_match,其取值为TRUE或FALSE; force_match=TRUE时相当于对force_matching_signature相同的sql语句都起作用,force_match=FALSE时对exact_matching_signature相同的sql语句都起作用。所以说sql文本的大小写与重复空格对sql的执行计划是没有影响的。使用了绑定变量,则固定执行计划的参数force_match对语句执行计划的固定也是没有影响的。
评论

