Home  >  Article  >  Database  >  关于提高Oracle应用程序的编程效率

关于提高Oracle应用程序的编程效率

WBOY
WBOYOriginal
2016-06-07 16:59:01915browse

Oracle应用程序效率的提高可以从以下几个方面着手进行:⑴业务逻辑功能调整;⑵优化数据结构设计;⑶优化数据处理步骤;

Oracle应用程序效率的提高可以从以下几个方面着手进行:

⑴业务逻辑功能调整;

⑵优化数据结构设计;

⑶优化数据处理步骤;

⑷优化SQL语句;

⑸物理结构调整;

⑹内存分配优化;

⑺I/O调整;

⑻解决内存争用;

⑼优化操作系统。

这里主要就SQL语句的优化总结一些经验以供参考:

1、SQL语句书写格式,使用共享SQL语句资源

在Oracle Server中,执行的SQL语句以游标(cursor)的方式存在于共享SQL区(sharedSQL aera)中,并按照下图所示流程处理:

当执行一条SQL语句时,Oracle先在共享SQL区中查找是否有相同的SQL语句存在,如果不存在,Oracle将新建游标,并且对语句进行分析,然后绑定变量并按分析后的执行计划执行SQL语句;但如果有相同的SQL语句存在,Oracle可共享使用已有游标,仅需重新绑定变量(或者不需要),即可重复执行。因此,使用相同的SQL语句,可以节省系统内存空间,提高代码运行效率。

Oracle按照以下原则判断SQL语句是否相同:

⑴字母大小写相同;

⑵空格数相同;

⑶注释相同;

⑷所使用的数据库对象(如:表等)相同;

⑸变量类型相同。

为实现游标共享,可使用存储过程、触发器、程序库等方式编写集中的代码。同时,按照固定的格式书写SQL语句也将提高游标共享的机率,从而提高代码效率。下例可作为SQL语句的书写格式以供参考:

 

2、使用索引

在对大量数据的表进行操作时,使用索引可以提高程序执行效率。建立索引时应注意:

⑴ 将经常用来查询的字段放在复合索引的前面;

⑵ 建立全表索引时,将限制性最强的字段放在最前面;

⑶ 建立主键、唯一键约束时,系统自动建立索引;

⑷ 建立外键约束时,系统不会自动建立索引,此时如果被引用的表经常修改,应在外键字段上建立索引,以防止锁表;

例如:pol_info.applicant引用client_info.insno作外键,如果pol_info.applicant上无索引,则修改client_info时会锁pol_info,如果在pol_info.applicant上加索引,即可防止上述锁出现,从而提高程序运行效率。

⑴ 只加必要的索引,否则反而会影响效率;

例如:对存在大量重复值的字段加索引会使程序执行效率大幅降低。

⑵ 尽量在where字句中直接使用有索引的字段;

例如:where col1= ‘XXX’及where col1 > v_num均可利用索引,而where col1||‘’= ‘XXX’或where col1-0 > v_num则不可利用索引。

⑶ 可强制SQL语句使用索引;例如:

select /*+index(classes)*/ *

from classes

where type = ‘IDL’

       and loc_id between 3003 and 30005;

3、表连接

⑴ 使用非相等连接将降低执行效率;

⑵ 多个表连接时,对于在select子句中不出现的表,可用子查询代替表连接;

⑶ 在from子句中,将小表放在后面,可提高执行效率;

⑷ 在where子句中将过滤记录数最多的条件放在最后;

⑸ 子查询数量较大时,使用表连接代替低效的SQL语句(IN,EXISTS,NOT IN,NOT EXISTS等)。

例如:有表一:createtable tab1(col1 varchar2(20) primary key,col2 number);

和表二:createtable tab2(col1 varchar2(20) primary key,col2 number);

A   现读取sum(tab1.col2),,且tab1.col1存在于tab2.col1中:

使用IN:select sum(col2) from tab1 wherecol1 in (select col1 fromtab2);

使用EXISTS:selectsum(col2) from tab1 a

where exists ( select * from tab2 wherecol1=a.col1);

使用连接:selectsum(a.col2) from tab1 a,tab2b where a.col1=b.col2;

B   现读取sum(tab1.col2),且tab1.col1不存在于tab2.col1中:

使用NOT IN:select sum(col2) from tab1 wherecol1 not in (select col1 from tab2);

使用NOTEXISTS:select sum(col2) from tab1 a

where not exists ( select * from tab2 wherecol1=a.col1);

使用外连接:selectsum(a.col2) from tab1 a,tab2b

where a.col1=b.col2(+) and b.col1 is null;

4、嵌套循环

在PL/SQL过程中,如果有两个表查询结果的嵌套循环,应尽量将小表放在外层循环中。

5、大表扫描

如果需要对两张很大的表进行连接扫描,并且其中一表的连接字段为主键或唯一键,可用过程实现两表均一次扫描完成。

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn