解决同一条sql在pl/sql工具中执行很快,在程序中却很慢
今天因为程序设计漏洞,把一张表得数据给truncate掉了,然后再重跑的过程中发现有一条sql再pl/sql工具执行很快(1秒内),程序中却需要200-300秒。
sql如下:
MERGE INTO t_qt_second t1
USING (select d.sn_no ,c.stair_org_id ,c.stair_org_name , a.assetpro_name , a.org_no , a.assetpro_nofrom t_org_sn a, t_device b, t_org_inf c , t_qt_second dwhere a.csn = b.dev_snand a.org_no = c.idorganizationand b.dev_sn = d.sn_no) t2
on (t1.sn_no = t2.sn_no)
WHEN MATCHED THENUPDATE SET t1.stair_org_id = t2.stair_org_id , t1.stair_org_name = t2.stair_org_name ,t1.assetpro_name = t2.assetpro_name,t1.assetpro_no = t2.assetpro_no , t1.org_no = t2.org_no;
执行时间如图:
如图,sql是一条批量修改sql。再面向搜索引擎编程过程中发现一个关键字,PreparedStatement 。这位大佬说
一开始怀疑是语句使用UPER函数导致的,但是把语句修改为不使用函数也一样慢。。怀疑是使用了PreparedStatement 参数需要动态绑定问题,于是将PreparedStatement 改为Statement ,执行却很快
然而因为我们系统的封装太厚了,没法将PreparedStatement 改为 Statement。于是我在想虽然我整个sql没有参数绑定,但是我给他强行加一个固定参数绑定会不会有效果!于是sql就变成了这样
MERGE INTO t_qt_second t1
USING (select d.sn_no ,c.stair_org_id ,c.stair_org_name , a.assetpro_name , a.org_no , a.assetpro_nofrom t_org_sn a, t_device b, t_org_inf c , t_qt_second dwhere a.csn = b.dev_snand a.org_no = c.idorganizationand b.dev_sn = d.sn_no*and 1 = ${variable}*) t2
on (t1.sn_no = t2.sn_no)
WHEN MATCHED THENUPDATE SET t1.stair_org_id = t2.stair_org_id , t1.stair_org_name = t2.stair_org_name ,t1.assetpro_name = t2.assetpro_name,t1.assetpro_no = t2.assetpro_no , t1.org_no = t2.org_no
可以看到在t2表 条件的最后我加了一个 and 1 = ${variable},其中variable变量在程序里面设置的是 1,然后再放到服务器上重跑一下。
!!!!!
再来看下执行时间!!!
终于舒服了~~~~~~
题外话:
这个应该和我们系统的破框架有关系,这个框架会存储程序运行过程中(变量、sql查询等一系列和数据有关系的操作)的数据以节点树的形式存储在树上(具体是什么树也没有研究过,框架封装太厚,看不到)。
以下是我对这破框架的猜想:
所以存在每一条sql运行过程中,会去扫描整个树中有没有某个节点是sql的绑定参数。才导致这种没有参数绑定的sql在程序上执行特别慢。
另外
如果有同样问题的朋友,并且你们是使用的mybatis,可以检查下自己动态绑定的参数 和 数据库中对应字段的 类型是不是一致。比如代码中给的类型是string,但是数据库中该字段是int,这样也可能会导致在工具上执行快,程序中很慢的情况。
解决同一条sql在pl/sql工具中执行很快,在程序中却很慢相关推荐
- 如何在Oracle数据库内格式化SQL或PL/SQL ?
点击上方"蓝字" 关注我们,享更多干货! 在一些情况下,梳理复杂的SQL或PL/SQL代码逻辑时最好是格式化一下文本. 当然我们有Toad或PL/SQL Developer等其它第 ...
- 【PL/SQL】PL/SQL介绍
一.PL/SQL的概述 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用 ...
- oracle 的遍历语法,oracle pl/sql之pl/sql语法
一.pl/sql基础 pl/sql分匿名块和命名块. 命名块:存储过程,函数,触发器,包等. pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块 ...
- 线上分享丨自治时代DBA的技能库:SQL和PL/SQL的深度编程(附上期PPT和视频)-云和恩墨大讲堂201905...
云和恩墨大讲堂又和大家见面了! 2018年云和恩墨大讲堂走过了祖国的大好河山,从大连到海口,从上海到昆明--不知道我们的课堂里有没有出现过你的身影. 2019我们也不会停下分享的脚步.不过这一次,我们 ...
- ORACLE PL/SQL编程--PL/SQL块结构和组成元素
本篇主要内容如下: 2.1 PL/SQL块 2.2 PL/SQL结构 2.3 标识符 2.4 PL/SQL 变量类型 2.4.1 变量类型 2.4.2 复合类型 2.4.2.1 ...
- oracle pl sql注意问题,Oracle PL/SQL编写PL/SQL代码的注意事项
(1)几个值得注意的关键字(2)变量常量赋值注意: ---------------------------------------------------------------------[@mor ...
- SQL游标——PL/SQL教程(三)
SQL游标 /* 在执行执行增删改查语句的时候,Oracle都会开辟一块内存空间, 用来暂时存放收到SQL语句影响的数据. 这块内存空间就被称为游标区域,我们可以借助于游标来分析这些受到影响的数据 * ...
- (转)动态SQL和PL/SQL的EXECUTE IMMEDIATE选项
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...
- 动态SQL和PL/SQL的EXECUTE选项分析
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...
- 【PL/SQL】PL/SQL语言基础
一.PL/SQL的块 (1)块(Block)是PL/SQL的基本程序单元 (2)一个PL/SQL应用程序由一个或多个块组成 1.PL/SQL块的基本组成 (1)定义部分(declare) --定义常量 ...
最新文章
- java虚拟机资源根目录_Java路径问题最终解决方案—可定位所有资源的相对路径寻址 - java - CSDN技术......
- reposurgeon 2.15 发布
- 注册与验证码php源代码,PHP验证码处理源代码
- 白光驱动器替代指南(转)
- 10没有基于策略的qos_基于强化学习的用户移动场景下空中基站3D位置高效部署...
- jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
- SAP应用有可能改造成Serverless架构么?
- 《四世同堂》金句摘抄(十七)
- 论文笔记(A Neural Influence Diffusion Model for Social Recommendation)
- [Usaco2006 Nov] Fence Repair 切割木板
- I2C设备调试及波形分析
- Protel99seMEX3
- 管理者要做木匠,不要做医生”。木匠眼里,没有废料,每一块木材都有它的作用;而在医生眼里,没有完全健康的人,每个人都是病人
- 【OpenGL】斯坦福兔子、显示列表
- mysql 10张表左关联查询_mysql left join 左连接查询关联n多张表
- iOS 11 NSPhotoLibraryAddUsageDescription 错误的解决办法
- 中文姓名按照拼音排序-python
- ip地址、子网掩码及ip地址的相关计算
- ESP32+PIO+LGVL+gui_guider
- swoole开启了守护进程如何关掉
热门文章
- 基于卷积神经网络的人脸表情识别综述
- php无法加载ssh扩展,php的ssh2扩展正常安装,却无法连接目标主机
- spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧...
- Linux驱动之定时器(mod_timer)
- SYN-COOKIE
- Chivas 芝华士12年-广告歌Sarah Khider《Mermaid Song》
- 无锁、偏向锁、轻量级锁、重量级锁,完整的锁升级!
- idea 编译jar_Flink1.9.2源码编译和使用
- C++中编译速度与平时代码规范
- linux显示文件开头部分内容,一天一个linux基础命令之查看文件开头部分内容head...