[20240901]21c Force matching signature的计算.txt --//以前如果sql语句出现绑定变量与常量混合的sql语句,计算force_matching_signature与EXACT_MATCHING_SIGNATURE是一样的.21c做 --//了一些改进,这样可以使用sql profile优化固定这样一类sql语句,以前没有使用21c,现在可以验证看看. 1.环境: SCOTT@book01p> @ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.测试: var empnum number exec :empnum := 7839 SCOTT@book01p> select count(1) from emp where empno = :empnum and deptno = 10; COUNT(1) ---------- 1 --//= 前后没有空格. SCOTT@book01p> @hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 1321163464 9kmf47x7byqq8 0 88776 1126804136 4ebf5ac8 2024-09-01 10:37:25 16777216 SCOTT@book01p> select count(1) from emp where empno = :empnum and deptno=20; COUNT(1) ---------- 0 SCOTT@book01p> @hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 1550218113 gz41rf5f6cww1 0 29569 1126804136 5c667381 2024-09-01 10:37:35 16777216 SCOTT@book01p> select sql_id ,force_matching_signature,EXACT_MATCHING_SIGNATURE from gv$sql where sql_id in ('9kmf47x7byqq8','gz41rf5f6cww1'); SQL_ID FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE ------------- ------------------------ ------------------------ gz41rf5f6cww1 12531360796234248997 13157356546279728935 9kmf47x7byqq8 12531360796234248997 12268692852591778641 --//可以发现现在2条sql语句FORCE_MATCHING_SIGNATURE相同等于12531360796234248997. --//使用我写的sql_idz.sh脚本验证看看. SCOTT@book01p> alter session set cursor_sharing=force ; Session altered. SCOTT@book01p> select count(1) from emp where empno = :empnum and deptno=30; COUNT(1) ---------- 0 SCOTT@book01p> @hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 1794040331 3y5y7ddpfxshb 0 57867 1126804136 6aeee20b 2024-09-01 10:40:25 16777216 SCOTT@book01p> select sql_text c90 from v$sqlarea where sql_id='3y5y7ddpfxshb'; C90 ------------------------------------------------------------------------------------------ select count(:"SYS_B_0") from emp where empno = :empnum and deptno=:"SYS_B_1" --//按照要求格式化后如下: SELECT COUNT ( :"SYS_B_0" ) FROM EMP WHERE EMPNO = :EMPNUM AND DEPTNO = :"SYS_B_1" --//有许多要求,=两边要有空格,count ( 之间也要有空格. --//小写变成大写.注意计算结尾没有chr(0). $ sql_idz.sh 'SELECT COUNT ( :"SYS_B_0" ) FROM EMP WHERE EMPNO = :EMPNUM AND DEPTNO = :"SYS_B_1"' 3 sql_text = SELECT COUNT ( :"SYS_B_0" ) FROM EMP WHERE EMPNO = :EMPNUM AND DEPTNO = :"SYS_B_1" full_hash_value(16) = BEB759D45ACFAE8EADE856400BCC7325 or beb759d45acfae8eade856400bcc7325 xxxxx_matching_signature(10) = -5915383277475302619 or 12531360796234248997 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ hash_value(10) = 197948197 sql_id(32) = avu2q805wswt5 sql_id(32) = avu2q805wswt5 sql_id(32) = avu2q805wswt5 --//如果前面为负数,以第2列为主,反之第1列.等于12531360796234248997完全能对上. --//full_hash_value(16) = beb759d45acfae8eade856400bcc7325,取后16位 ade856400bcc7325 = 12531360796234248997. $ sql_idz.sh 'SELECT COUNT ( 1 ) FROM EMP WHERE EMPNO = :EMPNUM AND DEPTNO = 10' 3 sql_text = SELECT COUNT ( 1 ) FROM EMP WHERE EMPNO = :EMPNUM AND DEPTNO = 10 full_hash_value(16) = 07896D82773C0975AA432725A91B5B51 or 07896d82773c0975aa432725a91b5b51 xxxxx_matching_signature(10) = -6178051221117772975 or 12268692852591778641 hash_value(10) = 2837142353 sql_id(32) = anht74qnjqquj sql_id(32) = anht74qnjqquj sql_id(32) = anht74qnjqquj --//9kmf47x7byqq8 12531360796234248997 12268692852591778641,EXACT_MATCHING_SIGNATURE完全一致. --//另外oracle提供dbms_sqltune.sqltext_to_signature函数FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE. --//直接带入字符串就可以计算. SCOTT@book01p> @ desc_proc sys dbms_sqltune sqltext_to_signature INPUT OWNER PACKAGE_NAME OBJECT_NAME sample : @desc_proc sys dbms_stats gather_%_stats OWNER PACKAGE_NAME OBJECT_NAME SEQUENCE ARGUMENT_NAME DATA_TYPE IN_OUT DEFAULTED ----- ------------ -------------------- -------- ------------- -------------- ------ ---------- SYS DBMS_SQLTUNE SQLTEXT_TO_SIGNATURE 1 NUMBER OUT N 2 SQL_TEXT CLOB IN N 3 FORCE_MATCH PL/SQL BOOLEAN IN Y 1 NUMBER OUT N 2 SQL_TEXT CLOB IN N 3 FORCE_MATCH BINARY_INTEGER IN N 6 rows selected. SCOTT@book01p> set numw 20 select dbms_sqltune.sqltext_to_signature('select count(1) from emp where empno = :empnum and deptno = 10') exact_match_signature, dbms_sqltune.sqltext_to_signature('select count(1) from emp where empno = :empnum and deptno = 10',force_match=>1) force_match_signature from dual; --//= 前后没有空格. EXACT_MATCH_SIGNATURE FORCE_MATCH_SIGNATURE --------------------- --------------------- 12268692852591778641 12531360796234248997
[20240901]21c Force matching signature的计算.txt
来源:这里教程网
时间:2026-03-03 20:35:09
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 拼多多上线“多多丰收馆”庆丰收,投入10亿补贴扶持新质农货商家
拼多多上线“多多丰收馆”庆丰收,投入10亿补贴扶持新质农货商家
26-03-03 - Oracle对象:序列(sequence)介绍
Oracle对象:序列(sequence)介绍
26-03-03 - 数据库性能再度提升20%.....
数据库性能再度提升20%.....
26-03-03 - IP打开“向下”空间,爱奇艺“摊牌了”
IP打开“向下”空间,爱奇艺“摊牌了”
26-03-03 - Oracle数据库,update阻塞select问题分析
Oracle数据库,update阻塞select问题分析
26-03-03 - 数据库管理-第235期 为什么RAC架构仍然很强(20240827)
数据库管理-第235期 为什么RAC架构仍然很强(20240827)
26-03-03 - rac集群二几点重启ora.gipcd不能正常启动
rac集群二几点重启ora.gipcd不能正常启动
26-03-03 - ORA-00600: 内部错误代码, 参数: [13011]处理
ORA-00600: 内部错误代码, 参数: [13011]处理
26-03-03 - 超过100万行 存储过程的超复杂Oracle数据库,国产化怎么办?
超过100万行 存储过程的超复杂Oracle数据库,国产化怎么办?
26-03-03 - 4家国产数据库上市公司半年报!最好的利润1个亿!最差的亏8000万!
4家国产数据库上市公司半年报!最好的利润1个亿!最差的亏8000万!
26-03-03
