Delphi 程序错误写法造成Oracle数据库负载异常

作者介绍

张洪涛 富士康 DBA

注意:本文涉及的问题在9i的环境中测试的,经验证,同样适用于11g.

在用Toad的SGA Trace工具监控我们的Oracle 9.2.0.8 Patch 31古董数据库时发现一条奇怪的SQL,它占到数据库整体逻辑读50%以上,SQL如下:

这条SQL单次执行逻辑读不到900,但执行非常频繁,它本意想查询HRM.ORGANIZATION表的表与索引信息。

程序员应该不会特意写这种SQL,那它到底来自哪里?

通过MODEL_NAME,找到SQL对应的Session,并做10046 Trace分析这条SQL与

SELECT departmentname FROM hrm.organization WHERE departmentid=:1交替执行。DB层面已经很难再有什么有价值线索,只有请开发提供源码分析。

这个程序使用Delphi7开发,很快开发将源码发来,代码如下:

分析Delphi程序在执行以下语句时调用了异常SQL。

ADOQuery2.SQL.Add(str_4);

ADOQuery2.Open;

ADOQuery2.First;

程序员正确使用了Delphi ADOQuery控件添加了SQL文本,并调用Open方法执行SQL,但为何要再调用First方法?

ADOQuery的First方法本意为定位到结果集的第一条记录。因为departmentid为主键,SELECT必返回一条记录,此步应为多余。请开发人员屏蔽掉ADOQuery2.First;再上线新版程序观察。

第二天这条诡异SQL仍被监控到,看样子屏蔽掉First方法调用并没有找到Root Cause,需要继续研究源码。

仔细分析此段程式,ADOQuery2调用Select语句时并没有使用绑定变量,是否是因为SQL硬解析造成异常SQL调用?

依此思路再将程序改写成以下使用绑定变量形式,并请程序员再次编译程序并上线。

第三天这条诡异SQL又被监控到,到底是哪里还有问题,还是解决问题的思路错了?再回到前一天改过的源码......

文本改为绑定变量没有错,是否Delphi ADOQuery控件执行Add方法时这条奇怪的SQL被调用?依据这个思路,再修改第三版程序,将ADOQuery 的Add方法调用放到While循环外,并请程序员重新编译上线。

现在在While循环外定义SQL,在While循环内给变量赋值并执行SQL。

继续监控发现这条诡异SQL终于消失了。确认Delphi ADOQuery调用Add方法时调用这条问题SQL获得对应表与索引信息。将Add方法移到While 循环外就彻底消除了循环内对问题SQL的调用。这也是Delphi ADOQuery控件在循环内执行SQL的正确方法。

Remark:

因为我们还有Informix 7 史前数据库,公司Policy规定不可用ODBC访问接口直接访问它,且Oracle 11.2 Gateway又不支持对Informix 7的访问,所以只有保留Oracle 9.2.0.8以利用其异构服务访问Informix 7。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java架构学习交流

数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程

       这篇文章是我之前写的博文 数据库方面的面试技巧,如何从建表方面展示自己能力 和 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻...

1945
来自专栏祝威廉

CarbonData实践(一)

CarbonData 拥有不错的明细查询能力,比如简单的where条件过滤,性能大概是Parquet的20倍。数据的聚合分析方面,如果有不错的where过滤,则...

995
来自专栏程序猿DD

优雅处理你的Java异常

来源:https://my.oschina.net/c5ms/blog/1827907

922
来自专栏mySoul

mongodb

NoSQL不使用SQL作为查询语言。其数据的储存可以不需要固定的表格形式。也会经常的被使用sql的join

1080
来自专栏智能大石头

2,ORM组件XCode(速览)

    啥也不说,上图: image.png     这是最基本的增删改查代码!     符合X系列组件的一贯作风,不求万能,只求简单实用!    ...

1729
来自专栏向治洪

外观模式

外观模式 为子系统中的一组接口提供一个统一接口。Facade模式定义了一个高层接口,这个接口使得这子系统更容易使用。 概述 实际应用中,我们在对付一些老旧的c...

1898
来自专栏烂笔头

在Python应用中使用MongoDB

目录[-] Python是开发社区中用于许多不同类型应用的强大编程语言。很多人都知道它是可以处理几乎任何任务的灵活语言。因此,在Python应用中需要一个...

3494
来自专栏IT技术精选文摘

分布式系统中生成全局ID的总结与思考

世间万物,都有自己唯一的标识,比如人,每个人都有自己的指纹(白夜追凶给我科普的,同卵双胞胎DNA一样,但指纹不一样)。又如中国人,每个中国人有自己的身份证。对于...

1808
来自专栏SDNLAB

OpenDaylight VTN源码及架构分析

VTN是opendaylight中负责租户隔离的工程,最近对源码和架构研究了一段时间,现将总结如下。 从VTN架构图我们可以看出,VTN共分为两个模块:VTN ...

3325
来自专栏前端儿

数据库初识--从MySQL 出发

要学Web 开发,也得先对数据库有所了解呀。数据库分门别类,多种多样,目前我选择了 MySQL 。

812

扫描关注云+社区