优化SQL对ORACLE数据库性能的提高

优化SQL对ORACLE数据库性能的提高


2024年4月4日发(作者:)

信息技术

2008NO.28

SCIENCE&TECHNOLOGYINFORMATION

科技资讯

优化

SQL

ORACLE

数据库性能的提高

710055)

徐艳赵文静

(西安建筑科技大学西安

摘要:影响ORACLE数据库性能的原因很多,论文通过优化SQL语句的几点措施,以期改善数据库的访问效率,经实际项目验证,能够明

显的提升数据库性能。

关键词:ORACLE数据库SQL优化

中图分类号:TP311.12文献标识码:A文章编号:1672-3791(2008)10(a)-0031-02

大多数情况下,系统运行缓慢不是由

于所有部件都饱和引起的,而是由于系统

中的某个部分限制了整体的性能,这部分

称为瓶颈。通常影响ORACLE数据库性能

指标的三个瓶颈主要是:CPU、内存、I/O。

数据库性能的优化主要是oracle数据库参

数的调整、磁盘I/O调整、应用程序SQL

语句分析及设计、网络性能调整等。本文

主要通过优化SQL语句来提高ORACLE数

据库的性能。

1SQL语句处理流程

如图1所示。

1.1打开游标

从上图可以看出处理SQL语句的第一

步就是要打开一个游标,事实上,一个完整

的SQL处理过程就是一个游标的生命周期。

1.2共享SQL

Oracle内存中有一个区叫SHARED_POOL,

这个区的主要作用就是将SQL语句存放在

这个区内,当客户发出一个新的SQL语句,

数据库引擎首先会到这个区查找是否有相

图1SQL语句处理流程

同的SQL,如果有,则避免了解析、分析索Bytes=1556076)

引、制定执行计划等一系列的动作。如果10TABLEACCESS(FULL)OF

没有则需要进行hardparse。'CLIENT_INFO'(Cost=31Card=17484

1.3绑定变量Bytes=1556076)

如果在SQL中指定了绑定变量,需要◆使用and关键字代替<>或!=时的

在这个阶段给SQL附上绑定变量的值。执行计划:

1.4并行处理SQL>select*fromclient_infowhere

如果SQL需要进行并行处理,在这一cl_no>1001andcl_no<1001;

阶段需要把整个SQL分割成多个并行的部norowsselected

分。ExecutionPlan

1.5执行查询0SELECTSTATEMENT

Oracle按照执行计划指定的方式执行Optimizer=CHOOSE(Cost=2Card=1

SQL,执行UPDATE和DELETE语句时,必Bytes=89)

须将行锁定,以免其他用户修改。Oracle先10FILTER

从数据库缓冲区中寻找是否存在所要的数21TABLEACCESS(BYINDEX

据块,如果存在,就直接读或修改,否则从ROWID)OF'CLIENT_INFO'(Cost=2

物理文件中读到数据库缓冲区中。Card=1Bytes=89)

1.6返回结果32INDEX(RANGESCAN)OF

对SELECT语句需要返回结果的语句,'IDX_CL_NO'(NON-UNIQUE)(Cost=1

首先看是否需要排序,需要,则排序后返回Card=1)

给用户,然后根据内存的大小不同,可以一从测试结果可以看出:

次取出一行数据,也可以一次取一组数据。<>与!=关键字会在SQL查询过程中

这时,可能要用到数据结构中的外部排序,使索引失效,造成全表扫描,所以应尽量使

并归排序等算法,所以如内存允许的话,会用and关键字来等价转换其相应的查询条

在很大程度上提高性能。件,从而提高查询速度。

2.2避免隐式转换

2SQL优化解决方案

隐式转换是最容易被开发人员忽视的

通常,一个关系数据库服务器上的SQL

一点,因为它并不影响查询结果,但它却影

进程要使用该服务器60%~90%的资源。

响了查询效率,在查询过程中,由于数据类

一般来说,数据库应用上60%的性能问题

型的不符合,造成隐式的调用to_char或

是因为运行着效率很低的SQL语句,而其

to_number函数。下面采用USER_INFO

中30%SQL语句的性能是可以被显著改进

(用户信息表)来测试这一过程,如表1所

提升的。

示。

2.1避免使用<>和!=

◆查询用户名称为101的客户信息,下

<>和!=都是不等于的意思,但在sql

面是没有隐式转换的查询:

开发过程中尽量不要使用,因为这个关键

SQL>select*fromuser_infowhere

字会造成索引失效,降低查询效率。下面

user_name='101';

是使用表client_info(客户信息表)进行测试

norowsselected

的情况,其中在cl_no(客户编号)列上建立

ExecutionPlan

了索引。

0SELECTSTATEMENT

◆使用<>或者!=查询条件时的执行

Optimizer=CHOOSE

计划:

10TABLEACCESS(BYINDEX

SQL>connabc123/passwd@MGB

ROWID)OF'USER_INFO'

Connected.

21INDEX(RANGESCAN)OF

SQL>setautotracetraceonly

'IND_USR_NAME'(NON-UNIQUE)

SQL>select*fromclient_infowhere

cl_no<>1001;

表1用户信息表

17485rowsselected.

ExecutionPlan

0SELECTSTATEMENT

Optimizer=CHOOSE(Cost=31Card=17484

科技资讯SCIENCE&TECHNOLOGYINFORMATION

31

科技资讯

2008NO.28

SCIENCE&TECHNOLOGYINFORMATION

◆查询用户名称为101的客户信息,下31488480

面是存在隐式转换的查询:Executedin11.219seconds

SQL>select*fromuser_infowhereSQL>selectcount(*)fromuser_info,

user_name=101;

cont_info;

norowsselected

COUNT(*)

ExecutionPlan

31488480

0SELECTSTATEMENT

Executedin48.407seconds

Optimizer=CHOOSE

这一结果表明,合理的表的连接顺序

10TABLEACCESS(FULL)OF

对数据库性能的提高是很有帮助的。

'USER_INFO'

2.4其他优化方案概述

从测试结果很容易看出:第二个查询

中索引失效了,这是因为ORACLE数据库

◆尽量使用Oracle已经提供的函数和

在解析过程中后台进行了隐式转换

方法,如:DECODE函数、MERGE关键字

user_name=to_char(101)造成的。

等,避免不必要的重复性开发。

2.3选择最有效率的表名顺序

◆避免使用ISNULL和ISNOT

ORACLE的解析器按照从右到左的

NULL关键字。

顺序处理FROM子句中的表名,因此

◆尽量多的使用COMMIT。

FROM子句中写在最后的表(基础表)将被

◆在程序编码中尽量避免使用“*”,

最先处理,在FROM子句中包含多个表的

因为ORACLE在解析过程中会将*解析成

情况下,必须选择记录条数最少的表作为

每个列,这个工作需要重新从数据字典中

基础表。当ORACLE处理多个表时,会运

查询获得,这就意味着解析过程将消耗过

用排序及合并的方式连接首先,扫描第一

多的时间。

张表(FROM子句中最后的那个表)并对记

◆避免索引列上的计算,尽量用>=代

录进行排序,然后扫描第二张表(FROM

替>,以减少扫描记录的个数。

子句中最后第二个表),最后将所有从第

◆尽量将SQL语句封装在PROCE-

二张表中检索出的记录与第一个表中合

DURE中,这样可以略去语义分析等大部

适记录进行合并。下面是对这一理论的

分重复性的工作。

验证,其中用户信息表user_info有999条

◆合理利用函数索引以避免全表扫

数据,合同信息表cont_info有32000条数

描,加快查询速度。

据。

◆对于不同规模的表,正确选择表的

SQL>selectcount(*)fromcont_info,

连接方式。

user_info;

除此之外,还有很多SQL优化方案,由

COUNT(*)

于篇幅等问题,不在一一测试验证。

(上接30页)

基于数值模拟结果,随着开挖步数的

下而产生的墙外侧位移。通过对以上计算增加,基坑支护外侧土体得位移量逐渐增

结果分析可以得出基坑开挖过程土体移动加,最大沉降量发生在第九步,沉降值大小

机理。由于基坑开挖垂直卸荷作用改变坑为28.7mm,满足工程需要。此外,随着基

底土体原始应力状态,基坑底部土体在卸坑开挖步数的增加地表位移的沉降量也在

荷后产生垂直弹性隆起。基坑周围土体向逐步增大,距离基坑较远处发生的地表沉

下移动,以补充由于基底隆起而损失的土降值较基坑附近地表沉降值要大

体。通过以上的计算可以得出结论,如果基于数值模拟结果,基坑开挖过程是

使用62m的地下连续墙体和五层钢管支撑基坑开挖面上卸荷的过程,由于卸荷而引

加四层钢筋混凝土梁的支撑体系,基坑在起坑底土体产生以向上为主的位移,同时

开挖过程中和开挖结束后,都还处于十分也引起围护墙体在两侧压力差的作用下而

稳定的状态,基坑的周围土体的地表最大产生的墙外侧位移。基坑在开挖过程中和

沉降量小于开挖深度的0.1%,围护墙体最开挖结束后,都还处于十分稳定的状态,基

大水平位移为41.2mm,同样满足小于开挖坑的周围土体的地表最大沉降量小于开挖

深度的0.14%。深度的0.1%,围护墙体最大水平位移为

41.2mm,同样满足小于开挖深度的0.14%。

3结语

本文结合上海市宜山路实际基坑工

参考文献

程,利用大型有限元分析软件FLAC-3D对[1]沈细中.深基坑工程基本过程数值模拟

基坑开挖过程土体的变形影响进行的数值及实时优化研究[J].武汉大学,2004.

模拟研究。分析研究结果表明:[2]应捷.考虑土—结构相互作用的深基坑

利用大型有限差分数值模拟软件进行弹性地基有限元分析[J].西安建筑科技

超深基坑开挖的数值模拟研究是切实可行大学,2003.

的,模拟分析得到的数值结果满足工程以[3]吴钰骅.软土深基坑工程流变及共同变

及理论上的基本要求,与实际工程测量结形性状研究[J].浙江大学,2004.

果大致吻合。[4]钱家欢,殷宗泽.土工原理与计算(第二

32

科技资讯SCIENCE&TECHNOLOGYINFORMATION

信息技术

3结语

SQL的优化与调整是花费最少且效果

最明显的提升数据库性能的方法,但同时

也是非常重要和复杂的内容。数据库性能

的提升不光是数据库管理员的职责,它需

要开发人员的配合与支持,并采用正确的

方法,才能最终达到优化的目的。

参考文献

[1]冯春培,盖国强,等.ORACLE数据库

DBA专题技术精粹[M].冶金工业出版

社,2004.

[2]DennisShasha,PhilippeBonnet.数据

库性能调优原理与技术[M].电子工业

出版社,2004.

版)[M].北京:中国水利水电出版社,

1994.

[5]龚晓南.土的塑性力学(第二版)[M].杭州:

浙江大学出版社,1999.

[6]TAI,D,SMALL,isofpileraft

systemsinlayeredsoils[J].IntJnlNum

AnalMechsInGeomechs,1996(20).


发布者:admin,转转请注明出处:http://www.yc00.com/web/1712223484a2025802.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信