怎么理解v$sql的exact_matching_signature与force_matching_signature.txt
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇文章为大家展示了怎么理解v$sql的exact_matching_signature与force_matching_signature.txt,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这
千家信息网最后更新 2025年01月24日怎么理解v$sql的exact_matching_signature与force_matching_signature.txt
本篇文章为大家展示了怎么理解v$sql的exact_matching_signature与force_matching_signature.txt,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
[20120918]理解v$sql的exact_matching_signature与force_matching_signature.txt
理解v$sql的exact_matching_signature与force_matching_signature,对于使用sql profile以及SPM有重要意义,自己对于这个一直没有很好的理解,
今天做一个测试看看,可能不全面^_^.
SQL> select * from v$version ;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
1.建立测试例子:
create table t as select rownum id1,trunc((rownum-1)/10)+1 id2,'test' name from dual connect by level<=100;
create index i_t_id1 on t(id1);
alter system flush shared_pool;
select /*+ findme */ name from t where id1=42;
select /*+ findme1 */ name from t where id1=42;
select /*+ findme */ Name from t where id1=42;
SELECT /*+ findme */ nAme FROM t WHERE id1 = 42;
SELECT /*+ Findme */ nAme FROM T WHERE id1 = 42 ;
SELECT /*+ Findme test */ nAme FROM T WHERE id1 = 42 ;
SELECT /*+ full(t) Findme */ nAme FROM T WHERE id1 = 42 ;
SELECT /*+ index(t) Findme */ nAme FROM T WHERE id1 = 42 ;
column format r 99
column sql_text format a60
column force_matching_signature format 99999999999999999999
column exact_matching_signature format 99999999999999999999
select rownum r,x.* from (
select sql_id,plan_hash_value,sql_text,exact_matching_signature,force_matching_signature
from v$sql where lower(sql_text) like '%/*%findme%' and sql_text not like '%v$sql%' order by exact_matching_signature) x;
R SQL_ID PLAN_HASH_VALUE SQL_TEXT EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE
1 0m8m91zz80rvh 1183254286 SELECT /*+ index(t) Findme */ nAme FROM T WHERE id1 = 42 1611223796141114091 11078870919385499790
2 f7aadcsrf2kkp 1601196873 SELECT /*+ full(t) Findme */ nAme FROM T WHERE id1 = 42 2823236535463672246 17243933052976400209
3 dhfmwm002g4z4 1183254286 SELECT /*+ Findme */ nAme FROM T WHERE id1 = 42 4375557158775460903 698688741679991361
4 85t7vsqqgjpst 1183254286 select /*+ findme */ name from t where id1=42 4375557158775460903 698688741679991361
5 5bcck0z12q1g6 1183254286 SELECT /*+ findme */ nAme FROM t WHERE id1 = 42 4375557158775460903 698688741679991361
6 7vbndspk1kt83 1183254286 select /*+ findme */ Name from t where id1=42 4375557158775460903 698688741679991361
7 2d7cgsth617gy 1183254286 SELECT /*+ Findme test */ nAme FROM T WHERE id1 = 42 6656879127321462824 2920394029241435021
8 apv57y4bk2uqv 1183254286 select /*+ findme1 */ name from t where id1=42 14445306118291341866 11192650436549747287
8 rows selected.
-- 仔细观察,可以发现:
1.EXACT_MATCHING_SIGNATURE 一样的,比如3,4,5,6 EXACT_MATCHING_SIGNATURE=4375557158775460903,其对应的FORCE_MATCHING_SIGNATURE也一样(698688741679991361).
2.如果注解仅仅是大小写的问题,其EXACT_MATCHING_SIGNATURE也是一样的,其他空格大小写也不受影响.
3.如果有注解不同,其EXACT_MATCHING_SIGNATURE就不同了.
我的感觉就是把语句换成大写,注解部分也是换成大写,去除多余的空格等字符,算出一个东西.
这个东西很容易联想oracle的一个参数cursor_sharing.
exect=>表示精确匹配
force=>估计就是绑定以后匹配的.
alter system flush shared_pool;
select /*+ findme */ name from t where id1= 42;
select /*+ Findme */ name from t where id1= 43;
SQL> @a
R SQL_ID PLAN_HASH_VALUE SQL_TEXT EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE
1 373zfvx9h7xah 1183254286 select /*+ findme */ name from t where id1= 42 4375557158775460903 698688741679991361
2 5nyk32fjxxqkc 1183254286 select /*+ Findme */ name from t where id1= 43 7094585129451441419 698688741679991361
--想象把常量换成了变量,这里的FORCE_MATCHING_SIGNATURE一样.
SQL> alter system flush shared_pool;
SQL> variable v_id1 number ;
SQL> variable v_idx number ;
SQL> exec :v_id1 := 42 ;
SQL> exec :v_idx := 43 ;
SQL> select /*+ Findme */ name from t where id1= :v_id1 and id2=1;
SQL> select /*+ Findme */ name from t where id1= :v_id1 and id2=2;
SQL> @a
R SQL_ID PLAN_HASH_VALUE SQL_TEXT EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE
1 b3x2pcgkxaxft 1183254286 select /*+ Findme */ name from t where id1= :v_id1 and id2=2 7008393373276421720 7008393373276421720
2 ckr7rh2zfrwcv 1183254286 select /*+ Findme */ name from t where id1= :v_id1 and id2=1 14799038700516685754 14799038700516685754
--但是如果语句中存在绑定变量,这个又不一样.而且这个时候EXACT_MATCHING_SIGNATURE = FORCE_MATCHING_SIGNATURE.
--有点乱,google找到一篇文章,老熊总结的,转抄如下.
http://www.laoxiong.net/sql-profiles-part.html
对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不包括字符常量)后,如果
SQL相同,那么SQL语句的exact_matching_signature就是相同的。对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,
比如均为大写(不包括字符常量),然后去掉SQL中的常量,如果SQL相同,那么SQL语句的force_matching_signature就是相同的。但是例
外的情况是:如果SQL中有绑定变量,force_matching_signature就会与exact_matching_signature一样的生成标准。
上述内容就是怎么理解v$sql的exact_matching_signature与force_matching_signature.txt,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
相同
常量
语句
字符
就是
大写
大小
空格
变量
注解
不同
东西
内容
技能
知识
篇文章
测试
简明
精确
重要
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全加密龙头
网络安全法制教育主题班会
远程监控服务器软件
服务器自建和托管租用有什么区别
邯郸网络安全征文
服务器装进机柜里有顺序要求吗
SD数据库提供主题检索吗
rust服务器直连前缀
怎样进行app软件开发
查询数据库两条数据的差值
饥荒建立了服务器后还是一格信号
随着网络技术越来越厉害
构成数据库的四个基本要素
数据库为数据添加行号
宿州网络安全考试学习
信号安全数据网服务器
源码服务器权限应该怎么设置
数据库修改密码图
深圳市集思软件开发怎么样
套现软件开发
医疗器械网络安全技术
服务器远程连不上网
我的世界抓精灵服务器
软件测试等软件开发之后开始
武汉有没有软件开发的学校
网络安全靠人民策划书
美国金融交易数据库
淂雨网络技术有限公司
无锡电商软件开发
数据库技术一般用的软件