暂无图片
暂无图片
7
暂无图片
暂无图片
4
暂无图片

关于SQL语句之SIGNATURE的理解

原创 Jenny 2021-10-03
3047

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相关属性,结果如下:
image.png
从结果可以看出:
(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对语句执行计划的固定也是没有影响的。

最后修改时间:2021-10-20 16:35:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

广州_老虎刘
暂无图片
1年前
评论
暂无图片 1
19c已经发生了变化:
1年前
暂无图片 1
2
流星
暂无图片
23天前
回复
暂无图片 0
实验在19.3.0.0.0版本中的表现和11G是一样的,可能你的19c版本更高吧。
23天前
暂无图片 点赞
回复
广州_老虎刘
暂无图片
21天前
回复
暂无图片 0
@流星 应该是19.12 以上变的, 你可以试试.
21天前
暂无图片 点赞
回复
筱悦星辰
暂无图片
1年前
评论
暂无图片 0
不求事事完美,但求超越自己,有正视不足的底气,才有一往无前的勇气。
1年前
暂无图片 点赞
评论