DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 933|回复: 0
打印 上一主题 下一主题

[待整理] “优秀示例”: Oracle代码规程

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 15:04:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
且不说Oracle的第三代语言(3GLs),如果对所有SQL和PL/SQL的优秀示例做出完整的论述,大概需要写成一本书——事实上,市面上已经有好几本这样的书出版了,在这里我只会列举一些比较“重量级”的Oracle优秀示例。

  在PL/SQL中使用阵列处理是一个很好的做法(如,使用bulk collect和forall)。批量处理能够大大减少PL/SQL语句执行引擎的环境切换次数,从而提高其性能。

  另一个优秀示例是把存储过程中的所有代码放入锁定的软件包中,这样可以生成模块单元。把存储过程放入软件包里可以实现相关程序和功能的分组。当单个包被使用,整个软件包都会载入内存中(内存会启动整个软件包?),把磁碟存取时间减到最少。通过这个方法我们同样可以把整个应用程序包载进内存中,防止发生重新载入和代码解析,从而减少严重影响性能的代码递归。

  PL/SQL(和SQL)的另一个优秀示例是使用适当的变量类型(当你需要NUMBER时不要使用VARCHAR2,反之亦然)。使用不适当的变量(用character跟number进行比较)会导致无用索引。保证变量类型正确的一种方法就是使用%TYPE 和%ROWTYPE。

  还有就是永远使用DBMS_PROFILER或使用像Quest Software的Quest Code Tester工具来验证循环逻辑。DBMS_PROFILER是Oracle提供的一个软件包,能够使你的代码生成对每行执行时间及所需时间的追踪。你可以验证循环执行次数应为最少。

  你同样应该验证适当的IF-THEN-ELSE结构。我的意思是你应该把最常用的选项放在前面(比如exit test)。这个方法同样使用于CASE结构。

  PL/SQL(以及Java、C、C++和其他所有Oracle相关的3GLs)中,另一个更为重要的优秀示例是首先调优SQL。即使是世界上设计最精密的程序,如果其中含有的SQL很差的话,运行起来性能也会不好。Quest的SQL Optimizer、Performance Analyzer、TOAD和SQL Navigator都能够优化SQL。

  在测试PL/SQL-SQL代码的时候,应利用匿名PL/SQL块来保证处理环境的相似性。如果你在一个标准的SQL环境里用文字代替绑定变量来进行测试,你所得到的执行计划会不同于当你使用匿名PL/SQL块和绑定变量时得到的执行计划,因此你的调整很可能不能获得很好的结果。使用Quest Code Tester能够保证你能获得你想要的结果。

  还有一个良好的编程做法是很好地利用临时表和PL/SQL索引表。不正确地使用”normal”表进行临时储存会降低性能,因此应使用临时表。而当内存空间足够运行PL/SQL表时使用临时表也会大大降低性能。你也可以利用视图来创建中间结果的缓存表。

  还有一个很简单易行的优秀示例是在IN OUT和OUT变量上利用NOCOPY。在一个使用IN OUT或OUT的PL/SQL程序中,如果NOCOPY关键字没有包含在其页首的变量声明中,所有的变量都会通过copyout程序传值(传值而非传引用)。而使用NONCOPY,所有通过引用传值,这样做会大大提高运行性能。

  最后,还要求所有SQL开发者生成解释执行计划,然后再经由同行评审。在较大的开发计划里,数据库管理员不可能检查所有的代码看是否获得最佳的性能,因此开发者首先对SQL代码性能进行调优是很必要的。只要开发者把SQL的索引功能调优,调整为正确的逻辑和技术,数据库管理员便能够对难以处理的问题代码进行更高级的调优。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-9-27 19:26 , 耗时 0.115797 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表