[20211210]优化遇到的奇怪问题.txt --//上午优化一条sql语句,遇到一些问题浪费许多时间,直到上午快下班才定位解决,在测试环境做一个小演示,避免在这些细节上犯错. 1.环境: SCOTT@book> @ ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 2.建立测试: $ cat t1.txt alter session set statistics_level = all; set term off select * from dept where REGEXP_LIKE(dname, '00', '00'); set term on @ dpc '' '' --//简单说明:我们生产系统设置cursor_sharing=force,这样里面的常量变成:"SYS_B_03", :"SYS_B_04"之类的.如果写在where里面的, --//可以查看v$sql_bind_capture视图获得.而在select里面的值无法抓取,我一般选择'00'字符. --//我的测试REGEXP_LIKE出现在where中,而我调试的sql语句REGEXP_LIKE出现在select 里面. SCOTT@book> @ t1.txt Session altered. PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID fy92msh4xvx6u, child number 0 ------------------------------------- select * from dept where REGEXP_LIKE(dname, '00', '00') Plan hash value: 3383998547 ---------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | ---------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 0 |00:00:00.01 | |* 1 | TABLE ACCESS FULL| DEPT | 1 | 1 | 20 | 3 (0)| 00:00:01 | 0 |00:00:00.01 | ---------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / DEPT@SEL$1 Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter( REGEXP_LIKE ("DNAME",'00','00',<not feasible>) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --//可以发现实际上居然错误的执行语句,可以看到执行计划.由于语句异常中止,我自己测试执行的sql语句非常快返回,而生产系统的语 --//句执行缓慢,非常不好理解. --//我开始注解一些where条件,最后发现问题在REGEXP_LIKE(dname, '00', '00'),我猜测第3个参数应该是i. select * from dept where REGEXP_LIKE(dname, '00', 'i'); SCOTT@book> @ t1.txt Session altered. PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID 2qwr8pxwdp0qu, child number 0 ------------------------------------- select * from dept where REGEXP_LIKE(dname, '00', 'i') Plan hash value: 3383998547 -------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 0 |00:00:00.01 | 6 | |* 1 | TABLE ACCESS FULL| DEPT | 1 | 1 | 20 | 3 (0)| 00:00:01 | 0 |00:00:00.01 | 6 | -------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / DEPT@SEL$1 Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter( REGEXP_LIKE ("DNAME",'00','i',HEXTORAW('50B1FE7B0000000004D90402000000000000000000000000C883D A060000000000000000000000000000000000000000120000000000000080B1FE7B0000000002000000000000000000000085000000' ) )) --//oracle过滤条件很奇特,以前没注意还有第4个参数. --//再次测试,这样才能正常还原生产系统遇到的情况. --//实际上我当时还犯了几个错误,当时注解set term off,执行是没有仔细看前面的提示,实际上执行语句已经报错.我自己没有想到这样也 --//能看到执行计划.实际上如果当时执行set echo on,也许就很注意到问题在那里了. --//浪费差不多一个小时,做一个记录,避免以后在这些细节上犯错. --//如果当时我打开set echo on,关闭set term off,这个错误很快能发现: SCOTT@book> @ t1.txt SCOTT@book> alter session set statistics_level = all; Session altered. SCOTT@book> --set term off SCOTT@book> select * from dept where REGEXP_LIKE(dname, '00', '00'); select * from dept where REGEXP_LIKE(dname, '00', '00') * ERROR at line 1: ORA-01760: illegal argument for function PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID fy92msh4xvx6u, child number 0 ------------------------------------- select * from dept where REGEXP_LIKE(dname, '00', '00') Plan hash value: 3383998547 ---------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | ---------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 0 |00:00:00.01 | |* 1 | TABLE ACCESS FULL| DEPT | 1 | 1 | 20 | 3 (0)| 00:00:01 | 0 |00:00:00.01 | ---------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / DEPT@SEL$1 Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter( REGEXP_LIKE ("DNAME",'00','00',<not feasible>) --//主要问题在于我没想到oracle sql语句执行报错,也能生成执行计划。
[20211210]优化遇到的奇怪问题.txt
来源:这里教程网
时间:2026-03-03 17:18:39
作者:
编辑推荐:
- [20211210]优化遇到的奇怪问题.txt03-03
- ocp 19c考题,科目082考试题-bigfile03-03
- Oracle 服务端进程03-03
- 单机是最好的架构之二数据同步03-03
- [20211210]swc.sql如何使用.txt03-03
- SQL 汉诺塔03-03
- SQL改写03-03
- OGG到hadoop03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 单机是最好的架构之二数据同步
单机是最好的架构之二数据同步
26-03-03 - SQL 汉诺塔
SQL 汉诺塔
26-03-03 - SQL改写
SQL改写
26-03-03 - OGG到hadoop
OGG到hadoop
26-03-03 - OGG-2
OGG-2
26-03-03 - 错误数据导致优化器不识别(高端优化手法用尽,结果尽然是这样)
错误数据导致优化器不识别(高端优化手法用尽,结果尽然是这样)
26-03-03 - Oracle MYSQL PG体系
Oracle MYSQL PG体系
26-03-03 - 世界数据库史
世界数据库史
26-03-03 - 开发规范是血泪教训
开发规范是血泪教训
26-03-03 - U盘分区损坏了还能恢复吗?双重方法解难题
U盘分区损坏了还能恢复吗?双重方法解难题
26-03-03
