今天因为程序设计漏洞,把一张表得数据给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工具中执行很快,在程序中却很慢相关推荐

  1. 如何在Oracle数据库内格式化SQL或PL/SQL ?

    点击上方"蓝字" 关注我们,享更多干货! 在一些情况下,梳理复杂的SQL或PL/SQL代码逻辑时最好是格式化一下文本. 当然我们有Toad或PL/SQL Developer等其它第 ...

  2. 【PL/SQL】PL/SQL介绍

    一.PL/SQL的概述 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用 ...

  3. oracle 的遍历语法,oracle pl/sql之pl/sql语法

    一.pl/sql基础 pl/sql分匿名块和命名块. 命名块:存储过程,函数,触发器,包等. pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块 ...

  4. 线上分享丨自治时代DBA的技能库:SQL和PL/SQL的深度编程(附上期PPT和视频)-云和恩墨大讲堂201905...

    云和恩墨大讲堂又和大家见面了! 2018年云和恩墨大讲堂走过了祖国的大好河山,从大连到海口,从上海到昆明--不知道我们的课堂里有没有出现过你的身影. 2019我们也不会停下分享的脚步.不过这一次,我们 ...

  5. 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 ...

  6. oracle pl sql注意问题,Oracle PL/SQL编写PL/SQL代码的注意事项

    (1)几个值得注意的关键字(2)变量常量赋值注意: ---------------------------------------------------------------------[@mor ...

  7. SQL游标——PL/SQL教程(三)

    SQL游标 /* 在执行执行增删改查语句的时候,Oracle都会开辟一块内存空间, 用来暂时存放收到SQL语句影响的数据. 这块内存空间就被称为游标区域,我们可以借助于游标来分析这些受到影响的数据 * ...

  8. (转)动态SQL和PL/SQL的EXECUTE IMMEDIATE选项

    EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...

  9. 动态SQL和PL/SQL的EXECUTE选项分析

    EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EX ...

  10. 【PL/SQL】PL/SQL语言基础

    一.PL/SQL的块 (1)块(Block)是PL/SQL的基本程序单元 (2)一个PL/SQL应用程序由一个或多个块组成 1.PL/SQL块的基本组成 (1)定义部分(declare) --定义常量 ...

最新文章

  1. java虚拟机资源根目录_Java路径问题最终解决方案—可定位所有资源的相对路径寻址 - java - CSDN技术......
  2. reposurgeon 2.15 发布
  3. 注册与验证码php源代码,PHP验证码处理源代码
  4. 白光驱动器替代指南(转)
  5. 10没有基于策略的qos_基于强化学习的用户移动场景下空中基站3D位置高效部署...
  6. jQuery对象和DOM对象互转的问题、jQuery文件引入问题、DOM版本的网页开关灯
  7. SAP应用有可能改造成Serverless架构么?
  8. 《四世同堂》金句摘抄(十七)
  9. 论文笔记(A Neural Influence Diffusion Model for Social Recommendation)
  10. [Usaco2006 Nov] Fence Repair 切割木板
  11. I2C设备调试及波形分析
  12. Protel99seMEX3
  13. 管理者要做木匠,不要做医生”。木匠眼里,没有废料,每一块木材都有它的作用;而在医生眼里,没有完全健康的人,每个人都是病人
  14. 【OpenGL】斯坦福兔子、显示列表
  15. mysql 10张表左关联查询_mysql left join 左连接查询关联n多张表
  16. iOS 11 NSPhotoLibraryAddUsageDescription 错误的解决办法
  17. 中文姓名按照拼音排序-python
  18. ip地址、子网掩码及ip地址的相关计算
  19. ESP32+PIO+LGVL+gui_guider
  20. swoole开启了守护进程如何关掉

热门文章

  1. 基于卷积神经网络的人脸表情识别综述
  2. php无法加载ssh扩展,php的ssh2扩展正常安装,却无法连接目标主机
  3. spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧...
  4. Linux驱动之定时器(mod_timer)
  5. SYN-COOKIE
  6. Chivas 芝华士12年-广告歌Sarah Khider《Mermaid Song》
  7. 无锁、偏向锁、轻量级锁、重量级锁,完整的锁升级!
  8. idea 编译jar_Flink1.9.2源码编译和使用
  9. C++中编译速度与平时代码规范
  10. linux显示文件开头部分内容,一天一个linux基础命令之查看文件开头部分内容head...