提升 PLSQL 开发性能漫谈

本文内容摘自《剑破冰山——Oracle开发艺术》一书,有删改。

1、触发器尽量考虑内部代码过程封装(解析次数)
2、避免动态 SQL

动态 SQL 和普通 SQL 在执行过程中最大的差别在于:动态 SQL 是在执行过程中编译,而普通 SQL 是在过程执行前就已经编译过了。如果过程中有大量动态 SQL,且执行很频繁,可以预计系统将会出现大量重新编译解析的工作;而普通 SQL 在过程执行的时候已经编译过了,就是所谓的一次编译多次执行,效率无疑会高出许多。

3、OLTP 系统中尽量使用绑定变量,而 OLAP 不宜使用绑定变量

OLTP 系统的特点是 SQL 执行非常频繁,并且用时非常短,此时共享池的重用执行计划减少硬解析所省下的时间相对就非常客观了。SQL 语句在共享池中解析是比较复杂的,将会完成逻辑优化、物理优化、生成计划等一系列动作。大多数 OLTP 系统运用中,解析用时会占 SQL 执行总用时的很大比例,因此不容忽视。使用绑定变量后,文本内容大体一致仅变量值不同的 SQL 语句会被共享池认为是同一 SQL 语句;而未绑定变量的程序语句中有多少次循环就会产生多少次硬解析。

4、减少对 SYSDATE 的调用

SYSDATE 函数在 Oracle SQL 开发中被大量使用,但它毕竟是函数(会产生额外的开销),如果频繁调用必然会对系统产生一定的影响,因此要有意识的避免直接调用这类函数。

5、避免对 MOD 函数的调用

某些 PL/SQL 函数在使用时比其他函数的开销要大得多,MOD 就是这种函数,可能是由于 Oracle 考虑了太多算法而性能较差,自定义逻辑往往更快,应减少使用。

6、设法减少表扫描次数
7、避免 SQL 中的函数调用

一般而言,在 SQL 编码中,尽量避免在 SQL 中进行函数调用,因为这样会产生大量递归调用而影响性能。多数情况下 SQL 中的函数调用都是多余的,如果用表关联连替代函数调用,往往是更高效的。

8、尽量用简单 SQL 替代 PL/SQL 逻辑

保持简单是一个非常朴素的理论。在实践中发现,写代码时有意识的注意到简单两字,将给系统性能带来极大好处。“尽可能利用 Oracle 提供的现有功能,用最简单的方式完成数据库逻辑”如果可以用一条简单 SQL 语句完成的逻辑,就避免将该 SQL 语句写得太过复杂,只有单条 SQL 语句无法实现业务逻辑时,才考虑使用存储过程。简化 SQL 语句是要有充分技巧的,需要开发人员不断加强对 Oracle 开发知识的学习和理解。(MERGE、INSERT ALL、WITH)

9、避免不必要的排序

排序是一种极耗资源的操作,在开发过程中,尽量避免不必要的排序,在不可避免的情况下,也尽可能利用索引本身有序的特性。

10、利用 Oracle 现有功能

自治事务、序列、临时表(create global temporary table)不要费尽心思去实现 Oracle 已经提供的功能。

11、使用 PLS_INTEGER 类型

在进行大批量的整数运算时,使用 PLS_INTEGER 类型比使用 NUMBER 类型的效率明显要高。

12、避免数据类型转换

经验不足的开发人员在代码中不会注意数据类型的一致性,进而会导致系统性能低下。数据类型转换需要额外开销,甚至会导致无法使用索引,因此需要确保比较运算中的数据类型相同。

13、IF 的顺序有讲究

根据条件出现的频率来排序 IF 条件,将大概率出现的条件放在前面。

14、设计开发对列是否为空慎重决定

观察到周围设计开发人员在进行表结构设计时,对表字段是否为空比较随意,其实这在开发中是要引起重视的。

15、分布式开发不可不知的 HINT(driving_site)

本文链接http://www.cnblogs.com/hanzongze/p/oracle-sql-performance.html
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!

转载于:https://www.cnblogs.com/hanzongze/p/oracle-sql-performance.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值