[20221207]为什么FORCE_MATCHING_SIGNATURE不一致.txt --//生产系统优化转移到备库,没有想到开发或者同事把许多查询移到到备库完成,当时慢并不能做为移动的理由.实际上移动到备库也快 --//不到那里.继续优化工作: 1.环境: SYS@192.168.100.237:1521/orcldg> @ pr ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 19.0.0.0.0 BANNER : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production BANNER_FULL : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 BANNER_LEGACY : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.分析: --//在2022-11-25 09:48:45 执行的. SYS@192.168.100.237:1521/orcldg> @ ashtop sql_id 1=1 &100day Total Distinct Distinct Seconds AAS %This SQL_ID FIRST_SEEN LAST_SEEN Execs Seen Tstamps --------- ------- ------- ------------- ------------------- ------------------- ---------- -------- 30225 .0 38% | 2022-11-24 11:11:46 2022-11-25 09:48:45 1 14391 13999 .0 18% | 1h98kpy1s770r 2022-11-24 13:37:50 2022-11-24 14:58:35 4 4846 13181 .0 17% | 623b841u978k2 2022-11-24 11:11:46 2022-11-25 09:48:44 8630 11853 9755 .0 12% | bu48z014njcg4 2022-11-24 11:12:26 2022-11-25 09:47:59 9733 5056 1159 .0 1% | f9pnxajd6cykm 2022-11-25 09:29:29 2022-11-25 09:48:48 1 1159 738 .0 1% | 686sth2hr8783 2022-11-24 11:11:45 2022-11-24 11:24:01 2 737 735 .0 1% | 0h17fpc351rp0 2022-11-24 11:13:23 2022-11-25 09:48:48 602 729 553 .0 1% | 2tfpup517t7c5 2022-11-25 09:20:05 2022-11-25 09:29:18 2 553 361 .0 0% | a91d0rd8qvu21 2022-11-24 11:12:18 2022-11-25 09:46:28 174 361 347 .0 0% | 0wu7fhhrf27c8 2022-11-24 11:11:46 2022-11-24 11:18:34 97 347 341 .0 0% | 71k88tu1yx8j6 2022-11-25 09:37:53 2022-11-25 09:41:13 2 200 222 .0 0% | 0sa1kg1c4d53w 2022-11-25 09:37:30 2022-11-25 09:41:12 1 222 200 .0 0% | 4yw3h0fnhbpbb 2022-11-24 15:11:45 2022-11-24 15:14:30 2 166 192 .0 0% | 8ss7js42xzp05 2022-11-24 11:16:41 2022-11-25 09:42:03 192 192 178 .0 0% | 2s7mc407pazjb 2022-11-24 11:12:15 2022-11-25 09:47:44 159 177 178 .0 0% | f454ryjfx6syf 2022-11-24 11:11:47 2022-11-25 09:47:10 178 178 166 .0 0% | 9pp9vzjw7k7r8 2022-11-24 15:11:45 2022-11-24 15:14:30 1 166 158 .0 0% | 17pamqymtc0cu 2022-11-25 09:14:52 2022-11-25 09:17:29 1 158 127 .0 0% | c3jafyjuwt13b 2022-11-24 11:16:36 2022-11-25 09:46:58 127 127 125 .0 0% | f6d0fpgm1w2sw 2022-11-24 11:31:41 2022-11-25 09:47:04 125 125 124 .0 0% | d946h5sr5gt69 2022-11-24 11:26:44 2022-11-25 09:47:06 124 124 121 .0 0% | 0tha0zcyf9maq 2022-11-24 11:21:39 2022-11-25 09:47:02 121 121 120 .0 0% | 2sq2bmkwuz6at 2022-11-24 11:31:42 2022-11-25 09:47:05 120 120 120 .0 0% | 6sbq34x7ckff7 2022-11-24 11:16:38 2022-11-25 09:47:01 120 120 119 .0 0% | fpamfm2pkznu1 2022-11-24 11:31:44 2022-11-25 09:42:07 119 119 117 .0 0% | 0zrwxj39q7u3w 2022-11-24 11:11:45 2022-11-25 09:42:08 117 117 117 .0 0% | 3tjcpzm0fkkf7 2022-11-24 11:22:19 2022-11-25 09:42:09 114 117 113 .0 0% | 5ub6g7qwaf35x 2022-11-24 11:16:37 2022-11-25 09:41:59 113 113 113 .0 0% | az4ju0qgum193 2022-11-24 11:16:40 2022-11-25 09:42:02 113 113 113 .0 0% | czkw1ncpthxy4 2022-11-24 11:21:37 2022-11-25 09:47:00 113 113 30 rows selected. --//Distinct Execs Seen 基本可以看成执行次数.可以发现好几条执行次数很少,当我查询时发现这些语句都无法查询到.理论讲dg执行 --//语句很少,查询不到,基本是从共享池消失,可以导致确定这些语句没有使用绑定变量,而且执行很慢.比如1h98kpy1s770r仅仅执行4次, --//耗费13999秒.平均每次13999/4 = 3499秒.注意后面的Distinct Tstamps=4846,也就是查询没有完成,另外又打开一个程序再次执行的 --//情况,或者想象操作员等不及,退出了程序,但是语句还在后台执行出现的情况.我估计操作员再次修改时间范围,结果查询要么快了要 --//么更慢,实际上的情况与我前几天看到的一样,执行选择优先选择了日期索引,而日期的查询范围相对很大比如几天,而且连接选择嵌套 --//执行,慢是很自然的. 3.在toad界面下查询,按照buffer_gets/executions降序排序: --//我发现几条执行很少的sql语句,抽取出两条sql语句,格式化保存为文本,使用diff比较.发现如下: R:\>diff a1.txt a2.txt 60c60 < AND a.pat_name LIKE '陈XX婷%' --- > AND a.pat_name LIKE '黄YY开%' --//语句大部分都一样,仅仅查询的病人名字不同. --//我开始想这样简单了我按照前面的优化思路优化一条语句,然后使用我写的spsw.sql脚本交换执行计划就ok了. --//完成后我发现不行,我只要换一个病人名字查询就出现很慢的情况,也就是这样的情况我无法通过sql profile稳定执行计划. --//查看对应语句的EXACT_MATCHING_SIGNATURE,FORCE_MATCHING_SIGNATURE: SYS@192.168.100.237:1521/orcldg> SELECT sql_id , length(sql_fulltext), EXACT_MATCHING_SIGNATURE, FORCE_MATCHING_SIGNATURE FROM v$sqlarea WHERE sql_id in ('g7qf8ub9jx093','b73a4k20wbjtj'); SQL_ID LENGTH(SQL_FULLTEXT) EXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE ------------- -------------------- ------------------------ ------------------------ g7qf8ub9jx093 1026 16687802159211697548 16687802159211697548 b73a4k20wbjtj 1026 16455271695327448147 16455271695327448147 2 rows selected. --//发现EXACT_MATCHING_SIGNATURE=FORCE_MATCHING_SIGNATURE,上下的FORCE_MATCHING_SIGNATURE并不相等. --//参考链接 [20180301]FORCE_MATCHING_SIGNATURE的计算.txt =>http://blog.itpub.net/267265/viewspace-743928/ --//当sql语句存在绑定变量与常量混合时,计算EXACT_MATCHING_SIGNATURE,FORCE_MATCHING_SIGNATURE的方法一样. --//摘要当时的测试结果: --//注意几个细节,计算时里面提示的空格取消了,变量与等号之间存在空格.小写变成了大写.我当时的结论: --//http://blog.itpub.net/267265/viewspace-743928/ 有如下的结论:对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同,比如均为大写(不包括字符常量)后,如果 SQL相同,那么SQL语句的exact_matching_signature就是相同的。对SQL语句,去掉重复的空格(不包括字符常量),将大小写转换成相同, 比如均为大写(不包括字符常量),然后去掉SQL中的常量,如果SQL相同,那么SQL语句的force_matching_signature就是相同的。但是例 外的情况是:如果SQL中有绑定变量,force_matching_signature就会与exact_matching_signature一样的生成标准。 4.剩下问题,这样如何优化呢? --//很明显采用原来sql profile方式不行.问题又如何解决呢? --//1.定期手工分析对应表,这样oracle就不会该日期范围内数据很少,优先选择该日期索引. 缺点这些表已经很大,分析即使自动取样也 --// 非常浪费时间. --//2.建立新索引将pat_name,查询日期作为复合索引,不过这里不行,因为pat_name与查询日期字段对应不同的表.也就是这个方法不可行. --//3.在system级别上设置cursor_sharing=force,这样类似语句的FORCE_MATCHING_SIGNATURE完全一致,使用sql profile稳定计划变得 --// 很简单了.我最终采用使用这样的方法. --//4.修改程序代码,使用绑定变量,其实该应用程序绑定变量做的算很好的,这么一条类似语句就导致运行慢,真的有点像一颗老鼠屎搞坏 --// 一锅汤. 5.总结: --//做到这里,我感觉我突然明白oracle在当sql语句存在绑定变量与常量混合时,选择这样的计算 --//EXACT_MATCHING_SIGNATURE,FORCE_MATCHING_SIGNATURE, --//也就是合理使用绑定变量,比如某表status=0很少,status=1很多. --//如果查询包括 status字段,直接使用status=0 或者 status =1 就很好,而不是使用绑定变量. --//其中细节给大家慢慢体会.
[20221207]为什么FORCE_MATCHING_SIGNATURE不一致.txt
来源:这里教程网
时间:2026-03-03 18:13:59
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- Oracle RAC命中ORA-7445只能打开一个节点故障案例分析
Oracle RAC命中ORA-7445只能打开一个节点故障案例分析
26-03-03 - 数据库日常实操优质文章分享(含Oracle、MySQL等) | 11月刊
数据库日常实操优质文章分享(含Oracle、MySQL等) | 11月刊
26-03-03 - Oracle数据库监控
Oracle数据库监控
26-03-03 - 好软件当然要拿出来分享啦!
好软件当然要拿出来分享啦!
26-03-03 - 阿里影业吹响盈利号角,电影院线黎明将至?
阿里影业吹响盈利号角,电影院线黎明将至?
26-03-03 - SQL语言基础(函数)
SQL语言基础(函数)
26-03-03 - 零工经济爆发:蓝鸟云破而后立,BOSS直聘稳步推进
零工经济爆发:蓝鸟云破而后立,BOSS直聘稳步推进
26-03-03 - 数据库选型比对 Oracle vs sqlserver
数据库选型比对 Oracle vs sqlserver
26-03-03 - 虚拟机搭建rac ASM盘启动失败
虚拟机搭建rac ASM盘启动失败
26-03-03 - Oracle 19c新特性之用户同时使用2个密码
Oracle 19c新特性之用户同时使用2个密码
26-03-03
