`
sui366
  • 浏览: 32226 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

oracle编写经验(转)

阅读更多

本文转自:http://bbs.chinabyte.com/thread-381770-1-1.html

 

 

以下的文章是对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存储过程编写经验和优化措施

    Oracle存储过程编写经验和优化措施 Oracle存储过程编写经验和优化措施 Oracle存储过程编写经验和优化措施

    Oracle Sql语句转换成Mysql Sql语句

    7. **视图和存储过程**:Oracle的视图和存储过程可能需要在MySQL中重新编写,因为两者的语法和权限管理不同。 OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,...

    一个用 Oracle 编写货币大写转换(函数不支持转换小数点)

    一个用 Oracle 编写货币大写转换(函数不支持转换小数点) 最多可能转换21位数字

    一个用 Oracle 编写货币大写转换(函数可转换小数点并支持四舍五入)

    一个用 Oracle 编写货币大写转换(函数可转换小数点并支持四舍五入)

    Oracle SQL编写规范

    Oracle SQL编写规范 Oracle SQL编写规范是指在编写SQL语句时的一些基本原则和方法,旨在提高SQL语句的执行效率和可读性。以下是Oracle SQL编写规范的详细解释: 1. 尽量用索引,特别在从大量数据中返回小部分数据...

    一个用 Oracle 编写货币大写转换(用过程编写不支持转换小数点)

    一个用 Oracle 编写货币大写转换(用过程编写不支持转换小数点)

    一个用 Oracle 编写货币大写转换(用过程编写支持转换小数点并且有四舍五入)

    一个用 Oracle 编写货币大写转换(用过程编写支持转换小数点并且有四舍五入)

    oracle函数的编写

    oracle函数的编写

    oracle LongRaw 转 Blob

    在Oracle数据库中,Long...通过C#这样的编程语言,我们可以编写自定义工具来实现这个转换,同时确保数据的完整性和一致性。在实际应用中,根据具体业务需求,可能还需要考虑数据备份、事务处理和错误处理等方面的问题。

    oracle汉字转拼音package包-支持UTF8

    在Oracle中,这样的包通常是开发人员自定义编写的,包含了一系列的PL/SQL程序单元,如过程(PROCEDURE)和函数(FUNCTION)。它们通过调用特定的API或者内置功能来完成汉字转拼音的任务。例如,可能会使用Oracle的...

    oracle金额转换

    编写这样的函数需要对汉字数字有深入了解,并且要考虑到零、整数部分和小数部分的处理。 其次,Oracle提供了`TO_CHAR`函数,它能够将数值转换为字符串,并可以应用各种格式模型。对于简单的货币格式化,如添加货币...

    oracle行转列

    - oracle_plsql函数大全(转).doc:PL/SQL是Oracle的编程语言,用于编写数据库过程和函数。文档中可能包含了各种内置函数的使用示例,如字符串处理、数学运算等。 - oracle分析函数.doc:分析函数如ROW_NUMBER(), ...

    oracle 表转实体类工具

    "Oracle表转实体类工具"是一种实用的开发辅助软件,它能自动化地将Oracle数据库中的表结构转换为Java实体类代码,极大地提高了开发效率。这个工具能够自动分析表的字段、数据类型,并生成对应的Java属性,同时还能...

    sqlserver自动生成sql语句工具sqlserver转oracle

    例如,SQL Server的T-SQL和Oracle的PL/SQL在存储过程编写上就有显著差异。 标签"sql 工具"表明我们需要一个专门的软件工具来辅助这个转换过程。"sql转oracle"则明确了转换的方向。市场上存在许多这样的工具,如SSMA...

    Sql语法转换为Oracle语法

    描述中提到的"SqlConvertToOracle.pas"是一个关键文件,它可能是一个用Delphi编写的源代码文件,包含了实现SQL语句转换的核心算法。Delphi是一种流行的面向对象的编程语言,常用于开发桌面应用程序,尤其是数据库...

    oracle日历转化成农历

    -- 由于篇幅限制,这里省略具体实现细节,实际应用需要根据具体的农历转换算法编写代码 -- 返回农历日期 RETURN TO_DATE(lunar_year || '-' || lunar_month || '-' || lunar_day, 'YYYY-MM-DD'); END convert_to...

    Oracle中金额大小写转换

    总的来说,Oracle中进行金额大小写的转换涉及到对数字字符串的处理、自定义函数的编写以及对汉字数字的映射理解。虽然Oracle本身不直接提供这样的功能,但我们可以通过PL/SQL编程来实现。希望这个示例能帮助你理解并...

    纯jsp+oracle编写的信息管理系统

    【标题】"纯jsp+oracle编写的信息管理系统"揭示了这个项目是基于Java Server Pages(JSP)技术和Oracle数据库构建的一款信息管理系统。JSP是Java的一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    总的来说,这个过程涉及到数据库设计、SQL语法理解和自动化脚本编写。对于大型或复杂的数据库迁移,可能需要专门的数据库迁移工具或服务来确保数据的完整性和一致性。对于简单场景,如描述中的单表转换,一个简单的...

    oracle使用经验

    - PL/SQL是Oracle专有的过程式语言,用于编写存储过程、函数、触发器等。理解PL/SQL语法和异常处理对于数据库的逻辑操作至关重要。 4. **数据库设计**: - 正确的数据模型设计是Oracle数据库的基础,包括选择合适...

Global site tag (gtag.js) - Google Analytics