开发者社区> 技术小能手> 正文

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

简介: 本文讲的是Delphi 程序错误写法造成Oracle数据库负载异常,在用Toad的SGA Trace工具监控我们的Oracle 9.2.0.8 Patch 31古董数据库时发现一条奇怪的SQL,它占到数据库整体逻辑读50%以上。
+关注继续查看

本文讲的是Delphi 程序错误写法造成Oracle数据库负载异常

作者介绍

image
张洪涛 富士康 DBA

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

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


image

image

image

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

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

通过MODEL_NAME,找到SQL对应的Session,并做10046 Trace分析这条SQL与
SELECT departmentname FROM hrm.organization WHERE departmentid=:1交替执行。DB层面已经很难再有什么有价值线索,只有请开发提供源码分析。

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


image

image

分析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,需要继续研究源码。

image


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

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


image

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

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

image


现在在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。

原文发布时间为:2017-09-21
作者: 张洪涛
本文来自云栖社区合作伙伴“ 数据和云”,了解相关信息可以关注“ 数据和云”微信公众号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
某教程学习笔记(一):10、oracle数据库注入
某教程学习笔记(一):10、oracle数据库注入
20 0
《ORACLE数据库和应用异构 迁移最佳实践》电子版地址
ORACLE数据库和应用异构 迁移最佳实践
14 0
Oracle数据库中通用的函数
Oracle数据库中的函数 🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
23 0
Oracle数据库SQL基本操作
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
35 0
Oracle数据库和客户端的安装
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
39 0
QGS
oracle数据库-简易巡检脚本
记oracle数据库-简易巡检脚本
48 0
Oracle生产数据库insert插入较慢分析过程和解决办法
Oracle生产数据库insert插入较慢分析过程和解决办法
27 0
Oracle 19C RPM安装及创建非容器数据库
Oracle 19c rpm安装及创建非容器数据库
141 0
Jdbc连接Oracle数据库详细案例,占位符的使用
Jdbc连接Oracle数据库详细案例,占位符的使用
39 0
+关注
技术小能手
云栖运营小编~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
EasyDBforOracle— 基于阿里云的Oracle最佳实践
立即下载
Oracle云上最佳实践
立即下载
迁移 ORACLE 最佳实践
立即下载