7
回答
Oracle数据库奇怪问题,同一SQL,在客户端和Java程序中执行效果居然天差地别
极速云服务器,低至1.04元/天>>>   

今天下午接到一个问题反馈,因为提错误的人员非常不专业,沟通了很久才搞清楚怎么重现。但是重现后却发现这个问题有点挑战自己的常识。

同一个SQL,通过Oracle的SQLDeveloper客户端,无论连接测试数据库还是正式数据库,执行耗时均在1秒内。但是在正式系统中,耗时高达628秒。

然后在测试系统中,无法重现这个问题。最后本地开发环境,在线联调,连接正式数据库,可以重现。但是又无法解释,为什么本地开发环境连接测试数据库和Oracle客户端连接正式数据库,执行同一条SQL,均无此问题。

目前正在请求DBA进行协助,同时在这里发布请求,看是否有Oracle方面的朋友遇到过类似问题,协助给点解决思路。

举报
魔力猫
发帖于1年前 7回/480阅
共有7个答案 最后回答: 1年前
查看执行计划,那一步耗时操作?
--- 共有 1 条评论 ---
魔力猫SQLDeveloper里面执行很快,不到1秒。问题就在这里,走系统程序,就很慢(正式服务器和本地开发环境),不走系统程序,只走Oracle客户端,就贼快。 1年前 回复

目前已经解决。确认故障是因为数据库把从系统和客户端提交的同一个SQL执行了不同的执行计划。但是等发现这点的时候,错误的执行计划已经被数据库抛弃了,暂时没法查到数据库到底执行了什么样的错误计划。恐怕只能等下次再出现,才能进行跟踪了。

问题解决。发现是自己错误进入了一个思维误区。就是认为如果没有预编译,数据库对于同一个SQL会执行相同的执行计划,但是实际上数据库执行了两个执行计划。

这个问题我碰到过,当时没去深究,我说下个人猜想。

可能.net自带的数据库驱动,在某些标志位上影响到了数据库执行计划的判断,因为现象就是清一色的无法实现并行度(可能和你OLTP的表现有点区别)。

解决的方法说简单也简单,说难也难,就是换oracle官方的.net组件,而不是用.net已经好久没维护的那个自带组件。

如果你不是.net的,可能也是类似原因吧。

关于这个问题我之前也遇到过类似的

具体情况是这样的 应用程序更新程序以及数据库一些属性后 重新部署上线

但是 线上的连接池没有重启(外部连接池

这个池子里的链接走的还是更新前的属性 导致没有使用最新的调整

后来重启连接池以后就恢复正常了

以后碰到类似情况可以试试

(估计可能是链接包或者是数据库链接本身的性质造成的

数据倾斜了,同一个sql参数不同差别很大
--- 共有 1 条评论 ---
魔力猫这条SQL本身没有预编译参数。如果有预编译,我早就会怀疑了。但是就是因为没有,所以才没第一时间想到。 1年前 回复
顶部