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
作者: 张洪涛
本文来自云栖社区合作伙伴“ 数据和云”,了解相关信息可以关注“ 数据和云”微信公众号

相关文章
|
1月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
171 64
|
26天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
33 7
|
26天前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
26 6
|
26天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
21 5
|
1月前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
1月前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
31 1
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
1月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
60 3
|
1月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
210 10
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。

推荐镜像

更多
下一篇
无影云桌面