开发中常见的Oracle三大故障与调优方法

墨墨导读:怀晓明先生(网名lastwinner),是具有多年数据库开发与项目管理经验的数据库专家。曾获得第一届ITPUB较佳建议奖,在多个大型IT企业多年的工作历练中,积累了丰富的系统架构设计经验。合著作品有《剑破冰山——ORACLE开发艺术》、《Oracle DBA手记2》。

我们知道在平时的Oracle开发工作中我们有时候会遇到些BUG,我曾经碰到过的BUG大致分为三类:

1. 出现ora-00600,ora-03113,ora-07445等错误,导致程序无法执行

2. 执行计划错误,导致很长时间才出结果

3. 由于执行计划错误而给出了错误的结果

第一类很让人无语,明明写的代码没有任何问题,但Oracle就是报这几个错误中的一个。这一般是Oracle的bug导致的,少部分是执行计划错误导致的。一般在生产环境中碰到这样的问题,只能认栽,通常只能换个方式来实现同样的功能,要不然就得换开发方案,但这样的开发成本就会很高了。如果在开发环境中碰到,还可以通过给数据库打补丁来解决这类问题(如果Oracle发布了的话,不过在生产环境上,补丁不是随便就可以打上的,一定要打的话,必须先做充分的测试)。

第二类很使人无奈,不过还好,为什么说“还好”?因为,这至少还能出来正确的结果嘛!这一般可以通过给数据库打补丁、修改参数、添加强制提示等方法来解决这类问题。比如我曾经碰到过Oracle10.2.0.5在Linux 64bit下出的full outer join的bug(类似于官方给出的bug2927071),一个full outerjoin出来结果需要两三分钟,而通过修改参数后,改变了原先不正确的执行计划,结果一秒内就哗哗哗的出来了,经验证结果也是正确的。

1alter session set "_optimizer_native_full_outer_join"=force;

第三类是最悲催的,可以说直叫人生不如死。为什么这么说?第一类bug碰到的话,Oracle会报错,起码能提醒你此路不通;第二类bug碰到的话,起码你本能的可以感觉到这里有问题,就算你没意识到,结果也是正确的,对吧?但这第三类bug,我从9i到10g都碰到过,明明写的SQL没任何问题,但Oracle偏偏就给你错误的结果,还好每次都因细心发现了,及时调整了技术方案,才没导致更大的问题发生。

碰到这些bug并不就意味着你很倒霉,事实上,换个角度看,首先要恭喜你,因为这说明你的sql水平已经达到了一个较高的程度了;倘若你能意识到不对劲,那说明你足够敏锐;再若你还能找到解决办法,那你就很厉害啦!

至于如何识别、解决开发过程中碰到的这类bug,这个话题比较大比较深,以后有机会我再和大家分享。但在这里我需要指明的是,其实很多最终结果不正确的程序,多数都是因为代码本身的问题导致的,而因为Oracle Bug导致的问题只占极少的部分。

关于Oracle的优化,俗话说“树挪死,人挪活”,咱不能因为一块石头堵在前面就非得把它炸开才能前行,绕过去往前走也是一种方法,对吧?

做系统优化其实也一样。系统的性能提升是涉及到方方面面的,从网络、操作系统、数据库、应用服务器到程序,都有提升的空间。现在很多人都知道,最该优化的部分是攻城狮们开发的程序,比如拿数据库的性能问题占比举例,有可靠的统计数据指出,70%的问题出在攻城狮编写的SQL上。而在这现象背后更根本的还在于,没有可胜任数据库开发工作的攻城狮!一旦出现系统性能问题,大家第一反应就是去找调优高手来优化SQL,久而久之,这就成了一个习惯。就好像平常不注意预防疾病,反正病了就找大夫治疗,而你也许不知道在未来某一天,面对焦急的亲属,白衣天使也会无奈的摇摇头,摘下口罩,叹了口气轻声道:“我们已经尽力了,你们准备后事吧……”

很多公司,包括专门做IT的公司在内,的确是没有意识到提高开发技术可以有效的提高系统性能,这个现象的本质关键是老板们没意识到提高开发技术其实是可以降低开发和后期运营维护成本的,这笔账算清楚了,老板自然愿意投入资源来提高工程师们的开发技能。通常不是技术出身的老板是意识不到的,这就需要技术管理者“晓之以理,动之以情”说服老板投入资源。当然,老板投入资源后,技术管理者必须hold得住,要将事情漂亮得完成,看到效果的老板自然就不会存疑了。

对于意识到了但是没技术资源去做的情况,只能用其他资源来换取技术资源了,比如内部培养人才、找外包、从外部请和尚等等。

老外也有句谚语——“一天一个苹果,你就不需要医生了”,这说的也是预防为主。我们转换下思路,如果提高了攻城狮们的开发水平,甚至是配备了专职的数据库开发工程师,那写出较高质量的SQL就不是什么难事儿。这样就提前消除了多数性能方面的隐患,自然就降低了后期出现性能问题的概率,也免去了大量的请人做调优的成本,而提高攻城狮们的开发水平成本并不是特别高,何乐而不为?ISO-9000告诉我们,质量是生产出来的,不是检测出来的,同样,高质量的SQL应该是开发写出来的,而不应总是通过DBA去调优出来。无论公司是否意识到、是否有资源去做,提高开发技术尤其是数据库端的开发技术都是大势所趋,不去迎面解决问题而装鸵鸟是不可取的。

Oracle的开发和运维是一个系统性的工作。简单说就是理论与实践充分结合,只懂理论和只会实践同样是不可取的,要学会用理论指导实践,通过实践验证理论,在实践过程中不断丰富理论知识,在理论指引下不断的提高实践能力

就数据库开发而言,最好具备如下能力与素质:

1. 掌握SQL基础知识和数据库基本理论,这会有助于你理解SQL是如何运作的,什么样的SQL会跑得更快。这可以通过学习相关白皮书或者技术文档获得

2.  学会提问。提问是一门艺术,无论学什么都需要掌握这门艺术。

3. SQL中高级知识,这能让SQL成为你的有力工具。这可以通过阅读官方文档,经常来itpub的数据库开发版块学习学习,来提高自己的水平。学习时不要想当然,就像trim并不等于rtrim+ltrim,认真读文档的人都知道。

4. 掌握至少一门相关的开发语言,java、php等等都行,这有助于你从另一个视角来认识数据库开发。

5.一定的数学能力,最好具备高中以上的数学知识。良好的数学素养可以为你带来新的思路和方法,有助于提高开发能力,并能帮助你理解。

6.一定的科学素养。类似于“某月有5个周五、周六和周日,这种现象823年才出现一次”的论调,一眼就要能看穿是假的(或者会通过程序去证伪),要知道1582年10月5日—14日这十天是不存在的等等。

总之,捷径是没有的,脚踏实地才能学得真知,做到以上几点,假以时日,成为高手并不是梦。

出处:墨天轮(https://www.modb.pro/db/7055)

Image placeholder
HUSH
未设置
  26人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Oracle/云MySQL/MsSQL“大迁移”真相及最优方案

最近一段时间碰到一些数据迁移的项目,如:Oracle迁移到MySQL,MsSQL迁移到MySQL,云MySQL迁移到本地MySQL。对于这方面做了系统的整理。包括:迁移方案的选择、如何跳出迁移遇到的坑

看得见的“岛”与看不见的“智慧”

俗话说:“耳听为虚,眼见为实”。都说华为把福州海峡国际会展中心所在的小岛,打造成了“智慧岛”。您亲眼所见了吗?  我亲眼所见了!并且有图有真相!我来带您全方位的去逛一逛!  您看得见场馆大门的闸机,但

一文带你掌握常见的Pandas性能优化方法,让你的pandas飞起来!

微信公众号:「Python读财」如有问题或建议,请公众号留言Pandas是Python中用于数据处理与分析的屠龙刀,想必大家也都不陌生,但Pandas在使用上有一些技巧和需要注意的地方,尤其是对于较大

Go语言高级编程_1.6 常见的并发模式

1.6常见的并发模式 Go语言最吸引人的地方是它内建的并发支持。Go语言并发体系的理论是C.A.RHoare在1978年提出的CSP(CommunicatingSequentialProcess,通讯

分布式存储时代,横空出世的OceanBase

数据,被誉为新时代的石油。几乎任何一个企业的IT管理者,都会在演讲、采访或其他形式的交流分享中强调数据的重要性。获取洞察、行为预测、市场分析、业务转型升级……数据能够为企业带来巨大的商业价值。但与此同

工具篇-IDEA中常用的快捷键

psvm:创建main函数sout:打印输出fori:实现for循环的代码结构alt+【number】打开各个面板,常见的有1(Project)、2(Favorites)、6(TODO)、7(Stru

网络故障排除的五个简单步骤

长期从事IT工作的人会发现很多网络问题,其中一些问题很容易诊断和纠正,但有些问题很难弄明白。如果遇到这些问题时能够通过一些简单的步骤来排除网络故障,以收集信息并缩小问题的范围。第1步:检查网络配置网络

事务注解(@Transactional)引起的数据覆盖故障

最近组织团队内技术培训,刘聪为分享的一个跟事务和写数据库相关的case(bug)很有代表性。用事务,要小心!一、故障现象车辆交付履约流程上两个节点(工程项目)A和B,A修改一条数据记录item(工单)

详解 PHP 中的三大经典模式

单例模式 单例模式的含义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。单例模式的三

详解 PHP 中的三大经典模式

单例模式 单例模式的含义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。单例模式的三

关于SD-WAN的三大误区

传统的广域网已经跟不上时代的发展速度。在宽带时代,网络专业人员在管理和配置分支机构时困难重重。员工注意到他们的关键业务应用程序的速度变慢了,而其他应用程序(如流媒体体育赛事)则会覆盖网络。拥有许多分支

中国进入5G普及时代!三大运营商5G套餐正式公布,每月128起,联通最壕套餐599

大数据文摘出品作者:曹培信、刘俊寰5G手机已经卖了一批了,三大运营商的5G套餐却姗姗来迟。原本定于10月1日发布5G套餐,之后又推迟了一个月,并且中国三大运营商在公布服务价格之前,已预先向1000万用

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Express 官网文档翻译-3.2-开发中间件

为Express应用开发中间件概述中间件函数本质上是一些可以在应用的请求-响应周期内,访问请求对象 (req),响应对象 (res),和next方法的函数。next方法是Express路由中的一个方法

团队开发中 Git 最佳实践,不给队友拖后腿

今天跟大家分享下团队开发中Git最佳实践的知识。0前言在2005年的某一天,Linux之父LinusTorvalds发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流

PHP Opcache 注意事项以及调优

从PHP5.5开始,Opcache扩展是核心的一部分,增加了对PHP脚本的字节码缓存的支持。对于动态语言(例如PHP),字节码缓存可以显著的提高性能,因为它可以确保脚本仅被编译一次。 Opcache扩

Go内存分配跟踪调优

今天小编为大家分享一篇关于Go内存分配跟踪调优的文章,文中涉及到一些压测及跟踪分析的工具,以及问题查找方法,希望能对大家有所帮助。Makeitwork,makeitright,makeitfast.–

SpringBoot 深度调优,让你的项目飞起来!

项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件application.p

慢查询分析调优工具~mysqldumpslow

在日常的业务开发中,MySQL出现慢查询是很常见的,要么说明你家产品的增长性很好,要么就是你的SQL写的太烂了。所以对慢查询SQL进行分析和优化很重要,其中mysqldumpslow是MySQL服务自

稳定性专题 | Spring Boot 常见错误及解决方法

导读『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方

研发总监谈:异地研发中心的建设的若干要点(上)

和楼主说好要写一点技术管理方向的文章,从开始说到正式接受主题为《异地研发中心建设模式》的约稿有数月之久,原计划1~2周内写完,结果光思考“应该要写什么”就花了一个月。一方面是拖延癌的原因,另一方面也是

layui table组件常见用法总结

table是layui最核心的组成之一。它用于对表格进行一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求。支持固定表头、固定行、固定列左/列右,支持拖拽改变列宽度,支持排序,支持多级表头