理解v$sql的exact_matching_signature与force_matching_signature
2015-08-12 10:15 abce 阅读(1913) 评论(0) 编辑 收藏 举报理解v$sql的exact_matching_signature与force_matching_signature
对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不包括字符常量)后,如果SQL相同,那么SQL语句的exact_matching_signature就是相同的。
对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不包括字符常量),然后去掉SQL中的常量,如果SQL相同,那么SQL语句的force_matching_signature就是相同的。
但是例外的情况是:如果SQL中有绑定变量,force_matching_signature就会与exact_matching_signature一样的生成标准。
select /*+ findme */ name from t01 where id=2; select /*+ findme1 */ name from t01 where id=2; select /*+ findme */ Name from t01 where id=2; SELECT /*+ findme */ nAme FROM t01 WHERE id=2; SELECT /*+ Findme */ nAme FROM t01 WHERE id=2; SELECT /*+ Findme test */ nAme FROM t01 WHERE id=2; SELECT /*+ full(t01) Findme */ nAme FROM t01 WHERE id=2; SELECT /*+ index(t01) Findme */ nAme FROM t01 WHERE id=2; SQL> create table t01(id number,name varchar2(30)); SQL> insert into t01 values(1,'bb01'); SQL> insert into t01 values(2,'bb02'); SQL> insert into t01 values(3,'bb03'); SQL> insert into t01 values(4,'bb04'); SQL> insert into t01 values(5,'bb05'); SQL> select /*+ findme */ name from t01 where id=2; SQL> select /*+ findme1 */ name from t01 where id=2; SQL> select /*+ findme */ Name from t01 where id=2; SQL> SELECT /*+ findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ Findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ Findme test */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ full(t01) Findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ index(t01) Findme */ nAme FROM t01 WHERE id=2; SQL> select sql_text,force_matching_signature,exact_matching_signature from v$sql where lower(sql_text) like '%/*%findme%' and sql_text not like '%v$sql%'; SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE -------------------------------------------------------------------------------- ------------------------ ------------------------ select /*+ findme */ Name from t01 where id=2 2.61638783165569E18 1.81667648323122E19 select /*+ findme1 */ name from t01 where id=2 1.48618482593165E19 3.84294405114677E18 select /*+ findme */ name from t01 where id=2 2.61638783165569E18 1.81667648323122E19 SELECT /*+ index(t01) Findme */ nAme FROM t01 WHERE id=2 8.64347201076369E18 1.06927716956949E19 SELECT /*+ full(t01) Findme */ nAme FROM t01 WHERE id=2 3.77473736948433E18 2.01226189844612E18 SELECT /*+ Findme */ nAme FROM t01 WHERE id=2 2.61638783165569E18 1.81667648323122E19 SELECT /*+ findme */ nAme FROM t01 WHERE id=2 2.61638783165569E18 1.81667648323122E19 SELECT /*+ Findme test */ nAme FROM t01 WHERE id=2 1.31270739882141E19 1.18833249442956E19 8 rows selected SQL> alter session set cursor_sharing=force; SQL> alter system flush shared_pool; SQL> select /*+ findme */ name from t01 where id=2; SQL> select /*+ findme1 */ name from t01 where id=2; SQL> select /*+ findme */ Name from t01 where id=2; SQL> SELECT /*+ findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ Findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ Findme test */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ full(t01) Findme */ nAme FROM t01 WHERE id=2; SQL> SELECT /*+ index(t01) Findme */ nAme FROM t01 WHERE id=2; SQL> select sql_text,force_matching_signature,exact_matching_signature from v$sql where lower(sql_text) like '%/*%findme%' and sql_text not like '%v$sql%'; SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE -------------------------------------------------------------------------------- ------------------------ ------------------------ select /*+ findme1 */ name from t01 where id=:"SYS_B_0" 1.48618482593165E19 1.48618482593165E19 select /*+ findme */ Name from t01 where id=:"SYS_B_0" 2.61638783165569E18 2.61638783165569E18 select /*+ findme */ name from t01 where id=:"SYS_B_0" 2.61638783165569E18 2.61638783165569E18 SELECT /*+ index(t01) Findme */ nAme FROM t01 WHERE id=:"SYS_B_0" 8.64347201076369E18 8.64347201076369E18 SELECT /*+ Findme test */ nAme FROM t01 WHERE id=:"SYS_B_0" 1.31270739882141E19 1.31270739882141E19 SELECT /*+ Findme */ nAme FROM t01 WHERE id=:"SYS_B_0" 2.61638783165569E18 2.61638783165569E18 SELECT /*+ full(t01) Findme */ nAme FROM t01 WHERE id=:"SYS_B_0" 3.77473736948433E18 3.77473736948433E18 SELECT /*+ findme */ nAme FROM t01 WHERE id=:"SYS_B_0" 2.61638783165569E18 2.61638783165569E18 8 rows selected SQL>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)