`

Oracle存储过程的编写经验总结

阅读更多
1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databsevv.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。
2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。
3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:

a) SQL的使用规范:

i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

vii. 尽量使用“>=”,不要使用“>”。 viii. 注意一些or子句和union子句之间的替换

ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

x. 注意Oracle存储过程中参数和数据类型的关系。

xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。

b) 索引的使用规范:

i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

v. 要注意索引的维护,周期性重建索引,重新编译Oracle存储过程。

c) tempdb的使用规范:

i. 尽量避免使用distinct、order by、group by、having、join、***pute,因为这些语句会加重tempdb的负担。

ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。

iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。

iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。

d) 合理的算法使用:

根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。

Oracle中Oracle存储过程和Sql语句的优化重点2008-07-29 09:14 | 末日风情

1.全表扫描和索引扫描

大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于>100万数据表影响很大。


Oracle中通过RowID访问数据是最快的方式


对字段进行函数转换,或者前模糊查询都会导致无法应用索引而进行全表扫描


对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上


2.顺序问题

Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。


对于Where条件的顺序,过滤到最大查询记录数量的条件必须写在Where条件的结尾处。


Where条件中涉及到使用复杂函数判定的必须注意要写到Where条件的最前面


3.索引方面

记录数少的表保留有主键索引就可以了,不要再去建其它索引,全表扫描也很快


索引最好单独建立表空间,必要时候对索引进行重建


必要时候可以使用函数索引,但不推荐使用


Oracle中的视图也可以增加索引,但一般不推荐使用


*Sql语句中大量使用函数时候会导致很多索引无法使用上,要针对具体问题分析


4.其它

避免使用Select *,因为系统需要去帮你将*转换为所有的列名,这个需要额外去查询数据字典。


Count(1)和Count(*)差别不大。


多使用Decode函数来作简单的代码和名称间的转换,以减少表关联


使用Truncate替代delete来删除记录,但Truncate数据不记录日志,无法进行回滚


对于复杂的Oracle存储过程可以多次提交的数据的要多分多次Commit,否则长事务对系统性能影响很大


Distinct和Having子句都是耗时操作,应该尽可能少使用


在不需要考虑重复记录合并时候用Union All来代替Union


使用显性游标而不使用隐性游标,特别是大数据量情况下隐性游标对性能影响很大


是否使用函数的问题


用直接的表关联来代替Exist.用Exist或Not Exists来代理In。In进行子查询效率很差。


5.SQL语句分析

通过SQLPLUS中的SET TRACE 功能对Sql语句的性能进行分析


通过Toad或PL/SQL Developer对语句的性能进行和索引的使用情况进行分析


对Oracle缺省的优化不满意可以强制使用Hint,但一般不推荐使用


对Flag等只存储是或否信息的字段,一般不推荐建立索引。必要可以采用位图索引


*存在递归查询情况如果关联Table太多对性能会造成较大影响,往往推荐采用临时表转为分步骤操作提高性能


*尽量使用表关联查询而不使用函数,但涉及类似于代码表要重复关联多次取数据问题时候又适合使用函数


上述的相关内容就是对Oracle存储过程编写经验和优化措施的描述,希望会给你带来一些帮助在此方面。

分享到:
评论

相关推荐

    基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

    基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip

    Linux课程设计.doc

    Linux课程设计.doc

    课程考试的概要介绍与分析

    课程考试资源描述 本资源是为应对各类课程考试而精心准备的综合性学习包。它包含了多门学科的考试指南、历年真题、模拟试题以及详细的答案解析。这些资源旨在帮助学生系统复习课程内容,理解考试要点,提高解题技巧,从而在考试中取得优异成绩。 资源中不仅包含了基础的考试资料,还特别加入了考试技巧讲解和备考策略分析。学生可以通过这些资源了解不同题型的解题方法和思路,学会如何在有限的时间内高效答题。此外,还有针对弱项科目和难点的专项训练,帮助学生攻克学习瓶颈。 为了确保资源的时效性和准确性,我们会定期更新考试资料和模拟试题,及时反映最新的考试动态和趋势。同时,也提供了在线交流平台,方便学生之间互相讨论、分享学习心得。 项目源码示例(简化版,Python) 以下是一个简单的Python脚本示例,用于生成包含选择题和答案的模拟试题: python import random # 定义选择题题库 questions = [ {"question": "Python的创始人是谁?", "options": ["A. 林纳斯·托瓦兹", "B. 巴纳姆", "C. 比尔·盖茨", "D.

    基于Django的食堂点餐系统

    基于 MySQL+Django 实现校园食堂点餐系统。 主要环境: PowerDesigner MySQL Workbench 8.0 CE Python 3.8 Django 3.2.8 BootStrap 3.3.7 Django-simpleui

    基于SpringBoot的同城宠物照看系统源码数据库文档.zip

    基于SpringBoot的同城宠物照看系统源码数据库文档.zip

    value_at_a_point.ipynb

    GEE训练教程

    基于springboot+Web的心理健康交流系统源码数据库文档.zip

    基于springboot+Web的心理健康交流系统源码数据库文档.zip

    kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip

    微信小程序 kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip

    N32G45X运放电路检测电压

    N32G45X运放电路检测电压

    梦幻西游道人20241121数据

    梦幻西游道人是梦幻西游里面的一个NPC,主要是刷全服最实惠的高级兽决和其他很好用的比较贵的东西,在长安城、傲来国、长寿村中的任意一个场景出现,一般会出现30分钟,不过东西一般都被秒刷。 梦幻西游道人出现时间解析如下: 1.梦幻西游道人出现时间一直都保持着一年出现两次的规律,即2、3月份的元宵节期间来一次,9月份的教师节期间出现一次。 2.云游道人每个整点(0:00至7:00不出现)会在长安城、傲来国、长寿村中的任意一个场景出现,每次出现后停留时间为30分钟。

    tables-3.7.0-cp38-cp38-win_amd64.whl

    tables-3.7.0-cp38-cp38-win_amd64.whl

    基于springboot旧物回收管理系统源码数据库文档.zip

    基于springboot旧物回收管理系统源码数据库文档.zip

    MariaDB集群部署手册word版最新版本

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 本文档介绍了MariaDB 10.1的集群部署,至少三台机器做成集群,每台可以同时提供读和写,感兴趣的小伙伴们可以参考一下

    JavaScript语言教程:基础语法、DOM操作、事件处理及新特性详解

    内容概要:本文档全面介绍了JavaScript作为一种轻量级的、解释型的语言及其在前端开发中的广泛应用。从JavaScript的基本概念出发,详尽讲解了基础语法(如变量、数据类型、运算符、流程控制)、函数和闭包、对象和原型、DOM操作(如获取、修改、添加和删除元素)、事件处理(如事件监听器、事件对象)、AJAX与Fetch API、ES6+的新特性(如箭头函数、模板字符串、解构赋值)以及前端框架和库(React、Vue、Angular)。除此之外,文章还涉及了代码优化技巧(如减少DOM操作、选择适当的算法和数据结构、使用工具提升代码性能),并对JavaScript的应用场景和发展趋势进行了展望。 适用人群:适用于初学者或具有少量编程经验的学习者,旨在帮助他们系统掌握JavaScript基础知识和前沿技术。 使用场景及目标:通过本教程的学习,读者不仅可以学会基本语法,还能理解并掌握高级概念和技术,如DOM操纵、事件处理机制、异步编程及最新的ECMAScript规范。这不仅有助于改善用户体验、增强网站互动性和响应速度,也能有效提升自身的编码水平和项目开发能力。 其他说明:此文档不仅涵盖了JavaScript的传统功能,还有现代前端技术和最佳实践指导,确保读者能够紧跟行业发展步伐,成为合格甚至优秀的Web开发人员。

    毕业设计&课设_安卓公交线路查询 app(含架构技术、数据格式及数据库相关说明).zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot高考志愿智能推荐系统源码数据库文档.zip

    基于springboot高考志愿智能推荐系统源码数据库文档.zip

    经典-FPGA时序约束教程

    经典-FPGA时序约束教程

    mcu交互实验整体文件

    mcu交互实验整体文件

    Collins COBUILD (CN).mdx

    Collins COBUILD (CN).mdx

    自定义springboot starter,提供HelloService

    自定义springboot starter

Global site tag (gtag.js) - Google Analytics