今天下午接到一个问题反馈,因为提错误的人员非常不专业,沟通了很久才搞清楚怎么重现。但是重现后却发现这个问题有点挑战自己的常识。
同一个SQL,通过Oracle的SQLDeveloper客户端,无论连接测试数据库还是正式数据库,执行耗时均在1秒内。但是在正式系统中,耗时高达628秒。
然后在测试系统中,无法重现这个问题。最后本地开发环境,在线联调,连接正式数据库,可以重现。但是又无法解释,为什么本地开发环境连接测试数据库和Oracle客户端连接正式数据库,执行同一条SQL,均无此问题。
目前正在请求DBA进行协助,同时在这里发布请求,看是否有Oracle方面的朋友遇到过类似问题,协助给点解决思路。
目前已经解决。确认故障是因为数据库把从系统和客户端提交的同一个SQL执行了不同的执行计划。但是等发现这点的时候,错误的执行计划已经被数据库抛弃了,暂时没法查到数据库到底执行了什么样的错误计划。恐怕只能等下次再出现,才能进行跟踪了。
问题解决。发现是自己错误进入了一个思维误区。就是认为如果没有预编译,数据库对于同一个SQL会执行相同的执行计划,但是实际上数据库执行了两个执行计划。
这个问题我碰到过,当时没去深究,我说下个人猜想。
可能.net自带的数据库驱动,在某些标志位上影响到了数据库执行计划的判断,因为现象就是清一色的无法实现并行度(可能和你OLTP的表现有点区别)。
解决的方法说简单也简单,说难也难,就是换oracle官方的.net组件,而不是用.net已经好久没维护的那个自带组件。
如果你不是.net的,可能也是类似原因吧。
关于这个问题我之前也遇到过类似的
具体情况是这样的 应用程序更新程序以及数据库一些属性后 重新部署上线
但是 线上的连接池没有重启(外部连接池
这个池子里的链接走的还是更新前的属性 导致没有使用最新的调整
后来重启连接池以后就恢复正常了
以后碰到类似情况可以试试
(估计可能是链接包或者是数据库链接本身的性质造成的