OracleSQL性能优化方法

合集下载

浅谈Oracle数据库SQL性能优化

浅谈Oracle数据库SQL性能优化

1引言 随着 软件 技术 的不 断发展 , 系统性 能越来 越重 要。 信息系统都 离不开 数据库应用, 而O r a c l e  ̄据库的应 用系统一般规模 比较大, 如 何优化O RAC L E 数据库 的性能就显得尤为重要 。 为 了保证O r a c l e  ̄ 据库运行在最佳 的性能状态下 , 在信息系统开发之前就应该考虑数 据库 的优化策 略。 优化策略一般包括服务器操作系统参数调整 、 数 据库参数调整 、 网络 性能调整 、 应用程序s Q 分析及设计等几个 方面 , 本文就如何优化s Q L 语句的方法 来实现对O RAC L E 数据库性 能的优化 。
时 间 最 少 的也 就 是 所 谓 成 本 最 低 的一 种 方 法 。
( 1 ) 索引优化 要尽可 能的使 用索引 , 减少磁盘 的I / 0 操作 。 ( 2 ) 连接手段 在进行查询连接 时优化器将所有连接 的方法全 来强迫选择最佳索引 。 部列举 出来 , 计算每一种连接的成本, 选择成本最低的一种 。 如连接 例如: s e l e c t * f r o m t b— — r p — — b i z s _ a p p — — f i n— — l i s t w h e r e a p p— — d a t e > 时用 到的数据 无法 获得 , 一般 系统会使 用平均密度作为依据 , 估算 y s d a t e 一1 a n d a p p — da t e <s ys da t e a n d e x c h — i d = 9 1 0 0 1 ’ 可能的命 中率 。 如, 一个存储过程或触 发器 中, 有表达 式的值在编译 s 时无法得到 , 优 化器 就只能使用 它的平均密度 来估 计命 中的记录 O RAC L E 选择 的是 e x c h _ i d 索引为先 , a p p _ d a t e 索引在后 , 数。 例如: D EC L ARE @v lu a e mo n e y 如果用RUL E 规则, 也只会选择 e x c h _ i d索引 , 表分析 后仍 不改变 S E L E C T n a me F RO M e mp l o y e e W HE R E s a l a r y =@v a l u e 选择 ( OR AC L E 对确 定条件的优先级权值 比非确定条件高 ) 只是 由于 ̄ a l u e 的值在执行 前不知道 , 它 只能使用其平均密度来估 解决方法 : 计这条命令将要命 中的记录数 。 a ) e x c h _ i d= ‘ 9 1 0 0 1 ’改 为 e x c h _ i d l l ”=‘ 9 1 0 0 1 ’ b ) s e l e c t后面使用强制索引条件 , 强制不让 使用e x c h _ i d 索引 ( 3 ) 其他 手段 如 , 数 据表 空间和索引表 空间的分 离 , 关系密切 的表之间的表空 间的分离 , 表 空间的物理分布 , 都可以提 高应用的 s e l ct/ e * + n o _ i n d e x ( a i d x _ r p — b i z s a p p f i n l i s t 一 5 ) / * f r o m t b —r p — bi z s _ a pp — in f _ l i s t a w he r e a p p— d a t e >s ys da t e —l a n d 性 能。 a p p _ d a t e <s ys d a t e a nd e xc h _ i d =’ 9 1 0 0 1 ’ 遵守这些原则就可 以优化排序操作 , 提 高s Q L 查询性 能。 2 ) 对于多表关联查询 , 需要通过观察执行计划和S QL 语句的关 3 Or a c l e 数据库S QL 查询优化的过程和方法 联条件 , 找出当前索引路径 , 分析最佳索引路径 , 通过屏 蔽等手段让 3 . 1 Or a c l e  ̄ l 据 库S QL 查询 语 句 处理过 程 下转第 1 9 6 页

Oracle SQL语句优化技术分析

Oracle SQL语句优化技术分析
4 结 论
O a e S L 句的性 能问题 常常是 由于 rl Q 语 c 在索引设计和查询设计方面存在各种缺陷引起 的。 Q 优化的实质就是在结果正确的前提下 , SL 充份利用索引 , 减少表扫描的 I / O次数 , 尽量避 免表搜索的发生 。 其实 S L Q 的性能优 化是一个 复杂的过程 ,以上这些只是在应用层次 的一种 体现 , 深入研究还会涉及数据库层 的资源配置 、 网络层的流量控制 以及操作系统层 的总体设计 如 等等方面 , 已经超 出本文所要讨论 的范 围, 这些 S EC EL T FROM US ER LOG WHER 因此不在本文赘述 了。 E 总之 Oal S L语句 的 r e Q c USE N R AME ei ( L C U E _ A 不断总结 , 才 xs t S E T S R N ME 优化需要我们在生产 中不断学习 , E FROM T F W HE TY C D =05 ' S AF E R CI 能更为得心应手 的应用到工作中去。 O E ' 1 4 3 O N操作符 . N TI 2 此操作是 强列不推荐使用 的 , 因为它不能
的 ,因为索引是不索引空值的。使用 I N L SU 或 I O U ,r l会停止使用 索引而执 SN TN L Oa e c 行 全表扫描。 以考虑在设计表时 , 引列设 可 对索 置为 N T N L 。这样就可以用其他操作来取 O U L 代 判断 N L 的操作。 UL
_
b .同一功能 同一性能 不同写法 S QL的影 响。 如一个 S L在 A程序员写的为 slc S Q eetU— e a ,s d f m s fB程序员写 的为 s—  ̄nme e r t u o a e le s r n meu e i f m zj s ( e t u e a . s r d r h .a 带表所有 o st f 者的前缀 )c程序员写的为 Sl tu rn n, e c s_s e e e z u ser i f m Z J . A F ( 写表名 )D程序 d r HS T F 大 o S 员 写 的 为 Slc srnme sri f m e et e_a , e_d r u u o z SS A F 中间多 了空格 )以上 四个 S L在 Ⅲ . F( T Q OAL R C E分析整理之后产生的结果及执行的时

oracle sql 优化技巧

oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。

为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。

首先,减少访问数据库的次数是最基本的优化方法。

Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。

因此,尽量减少访问数据库的次数,可以有效提高系统性能。

其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。

Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。

在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。

DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。

在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。

该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。

建议将该参数设置为 200。

当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。

执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。

因此,TRUNCATE 命令执行时间短,且资源消耗少。

在使用 Oracle 时,尽量多使用 COMMIT 命令。

SQL优化工具及使用技巧介绍

SQL优化工具及使用技巧介绍

SQL优化工具及使用技巧介绍SQL(Structured Query Language)是一种用于管理和操作关系型数据库的编程语言。

它可以让我们通过向数据库服务器发送命令来实现数据的增删改查等操作。

然而,随着业务的发展和数据量的增长,SQL查询的性能可能会受到影响。

为了提高SQL查询的效率,出现了许多SQL优化工具。

本文将介绍一些常见的SQL优化工具及其使用技巧。

一、数据库性能优化工具1. Explain PlanExplain Plan是Oracle数据库提供的一种SQL优化工具,它可以帮助分析和优化SQL语句的执行计划。

通过使用Explain Plan命令,我们可以查看SQL查询的执行计划,了解SQL语句是如何被执行的,从而找到性能瓶颈并进行优化。

2. SQL Server ProfilerSQL Server Profiler是微软SQL Server数据库管理系统的一种性能监视工具。

它可以捕获和分析SQL Server数据库中的各种事件和耗时操作,如查询语句和存储过程的执行情况等。

通过使用SQL Server Profiler,我们可以找到数据库的性能瓶颈,并进行相应的优化。

3. MySQL Performance SchemaMySQL Performance Schema是MySQL数据库提供的一种性能监视工具。

它可以捕获和分析MySQL数据库中的各种事件和操作,如查询语句的执行情况、锁的状态等。

通过使用MySQL Performance Schema,我们可以深入了解数据库的性能问题,并对其进行优化。

二、SQL优化技巧1. 使用索引索引是提高SQL查询性能的重要手段之一。

在数据库中创建合适的索引可以加快查询操作的速度。

通常,我们可以根据查询条件中经常使用的字段来创建索引。

同时,还应注意索引的维护和更新,避免过多或过少的索引对性能产生负面影响。

2. 避免全表扫描全表扫描是指对整个表进行扫描,如果表中数据量较大,查询性能会受到较大影响。

Oracle SQL性能优化

Oracle SQL性能优化
子:
S L语 法 的性 能 至关 重要 。 Q 1 选 择最 有 效率 的 表名 顺序 ( 只在 基 于规 则 的优 化 器 中有 效 ) O A L 的解 析 器 按 照 从 右 到左 的顺 序 处 理 F O 子 句 中 的表 R CE R M 名 ,F O 子 句 中写 在最 后 的 表 ( 础 表 diigt l)将 被 最先 处 R M 基 r n a e v b
所 引用 的 表 。 2 WH R E E子句 中的连 接顺 序 O A L R C E采 用 自下 而 上 的顺 序 解 析 WH R E E子 句 ,根 据 这个 原 理 ,表 之 间 的 连 接 必 须 写在 其 他 WH R 条 件 之前 ,那些 可 以 过 滤 EE 掉 最大 数 量记 录 的 条件 必须 写 在 WH R E E子句 的末 尾 。 3S I C E J T子 句 中避 免使 用 ’ E : 0 C正 在解 析 的过 程 中 ,会 将 ’依 次 转 换 成 所 有 的列 名 , RA I 这 个工 作 是通 过 查 询数 据 字典完 成 的 。这 意 味着 将 耗费 更 多 的时 间
理 ,在 F O 子 句 中包 含 多 个 表 的情 况 下 ,你 必 须 选 择记 录 条数 最 RM 少 的表 作 为基 础 表 。 如 果有 3个 以上 的表 连 接 查 询 ,那就 需 要 选 择 交 叉 表 (nesci a l) 作 为 基础 表 ,交 叉 表 是 指 那 个 被 其 他 表 it e t n t e r o b
维普资讯
Oal S L性能优化 rc Q e
陈 运庆 ( 中国石 油哈 尔滨石化 分 公 司信 息 中心 , 黑龙 江 哈 尔滨 1 o o ) 5 o o
摘 要 :提 出 几种优 化 O A L Q R C E S L语 句 的优化 方法 , 来提 高 o c rl a e数据 库 的 查询 速 度 。

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法

常见Oracle数据库优化策略与方法
Oracle数据库优化是提高数据库性能的关键步骤,可以采取多种策略。

以下是一些常见的Oracle数据库优化策略:
1.硬件优化:这是最基本的优化方式。

通过升级硬件,比如增加RAM、使用
更快的磁盘、使用更强大的CPU等,可以极大地提升Oracle数据库的性能。

2.网络优化:通过优化网络连接,减少网络延迟,可以提高远程查询的效率。

3.查询优化:对SQL查询进行优化,使其更快地执行。

这包括使用更有效的
查询计划,减少全表扫描,以及使用索引等。

4.表分区:对大表进行分区可以提高查询效率。

分区可以将一个大表分成多
个小表,每个小表可以单独存储和查询。

5.数据库参数优化:调整Oracle数据库的参数设置,使其适应工作负载,可
以提高性能。

例如,调整内存分配,可以提升缓存性能。

6.数据库设计优化:例如,规范化可以减少数据冗余,而反规范化则可以提
升查询性能。

7.索引优化:创建和维护索引是提高查询性能的重要手段。

但过多的索引可
能会降低写操作的性能,因此需要权衡。

8.并行处理:对于大型查询和批量操作,可以使用并行处理来提高性能。

9.日志文件优化:适当调整日志文件的配置,可以提高恢复速度和性能。

10.监控和调优:使用Oracle提供的工具和技术监控数据库性能,定期进行性
能检查和调优。

请注意,这些策略并非一成不变,需要根据实际情况进行调整。

在进行优化时,务必先备份数据和配置,以防万一。

浅谈Oracle数据库SQL性能优化

浅谈Oracle数据库SQL性能优化

浅谈Oracle数据库SQL性能优化摘要:随着计算机信息网络技术的不断发展,数据库系统取得很大突破。

面临网络化时代的进步,人们对网络信息的需求的也变得逐渐走向多元化。

网络信息数据库存取技术逐渐被广泛运用,数据库系统规模也越来越大。

目前Oracle 就是被广泛应用的一种数据库,其信息存储量能满足人们日益增长的需求,但为了能够保证其能够流畅稳定安全地运行,应当对其进行一定的优化措施。

关键词:Oracle数据库;SQL优化随着数据库技术功能逐步增加,应用范围逐渐扩展,效果也是日渐明显。

随着网络信息吞吐量的逐步增加,数据库系统在对数据进行处理时算法变得十分繁琐。

数据库系统如果长时间的超负荷工作就会变得反应迟钝影响效率,甚至可能导致死锁。

由于天天都将会有大量的SQL语句访问Oracl数据库系统,系统需要很多时间来处理这些访问,而SQL语句直接影响到Oracl数据库系统性能,所以运用对SQL语句优化的方法来提升ORACLE数据库的性能显得十分必要。

1、对SQL进行优化的必要性数据库系统作为数据管理的主要组成部分主要作用是存储供相关人员查阅大量信息,实现网络资源共享。

查询操作在数据库系统的各种操作中居于首位,直接关系到数据库系统的运行状态。

假如数据查询操作量过大,会给系统带来很大的负担,系统反应速度变慢,严重者可能就会引起系统瘫痪。

因此,为了保证数据库系统的高效正常运行,必须对SQL语句进行优化[1]。

图1.1SQL语句优化2、SQL优化的目标往往由于SQL的结构设计的问题,很可能使得正常运行的一个数据库系统出现性能问题。

所以必须对SQL语句进行必要的调整,达到有效提升数据库系统性能的目的。

对SQL结构的优化本质就是简化繁琐的数据结构,常规方法一般就是对SQL语法进行一些调整,基本方法是把程序中繁琐的SQL语句结构简化,保持服务器的搜索数据能力处于最佳运行状态,有效降低程序中表扫描的时间,促使所以功能得以充分发挥,尽量使服务器的处理器时间和输入输出时间保持平衡。

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法1. 使用合适的索引索引是提高查询性能的重要手段。

在设计表结构时,根据查询需求和数据特点合理地添加索引。

可以通过创建单列索引、复合索引或者位图索引等方式来优化SQL查询。

2. 确保SQL语句逻辑正确SQL语句的逻辑错误可能会导致低效查询。

因此,在编写SQL语句前,需要仔细分析查询条件,确保逻辑正确性。

3. 使用连接替代子查询在一些场景下,使用连接(JOIN)操作可以替代子查询,从而减少查询的复杂度。

连接操作能够将多个数据集合合并为一个结果集,避免多次查询和表的扫描操作。

4. 避免使用通配符查询通配符查询(如LIKE '%value%')在一些情况下可能导致全表扫描,性能低下。

尽量使用前缀匹配(LIKE 'value%')或者使用全文索引进行模糊查询。

5. 注意选择合适的数据类型选择合适的数据类型有助于提高SQL查询的效率。

对于整型数据,尽量使用小范围的数据类型,如TINYINT、SMALLINT等。

对于字符串数据,使用CHAR字段而不是VARCHAR,可以避免存储长度不一致带来的性能问题。

6. 优化查询计划查询计划是数据库在执行SQL查询时生成的执行计划。

通过使用EXPLAIN PLAN命令或者查询计划工具,可以分析查询计划,找出性能瓶颈所在,并对其进行优化。

7. 减少磁盘IO磁盘IO是影响查询性能的重要因素之一。

可以通过增加内存缓存区(如SGA)、使用高速磁盘(如SSD)、使用合适的文件系统(如ASM)等方式来减少磁盘IO。

8. 分区表对于大数据量的表,可以考虑使用分区表进行查询优化。

分区表可以将数据按照某个规则分散到不同的存储区域,从而减少查询范围和加速查询。

9. 批量操作尽量使用批量操作而不是逐条操作,可以减少数据库的事务处理开销,提高SQL执行效率。

可以使用INSERT INTO SELECT、UPDATE、DELETE等批量操作语句来实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OracleSQL性能优化方法Oracle性能优化方法(SQL篇) (1)1综述 (2)2表分区的应用 (2)3访咨询Table的方式 (3)4共享SQL语句 (3)5选择最有效率的表名顺序 (5)6WHERE子句中的连接顺序. (6)7SELECT子句中幸免使用’*’ (6)8减少访咨询数据库的次数 (6)9使用DECODE函数来减少处理时刻 (7)10整合简单,无关联的数据库访咨询 (8)11删除重复记录 (8)12用TRUNCATE替代DELETE (9)13尽量多使用COMMIT (9)14运算记录条数 (9)15用Where子句替换HA VING子句 (9)16减少对表的查询 (10)17通过内部函数提高SQL效率 (11)18使用表的不名(Alias) (12)19用EXISTS替代IN (12)20用NOT EXISTS替代NOT IN (13)21识不低效执行的SQL语句 (13)22使用TKPROF 工具来查询SQL性能状态 (14)23用EXPLAIN PLAN 分析SQL语句 (14)24实时批量的处理 (16)1综述ORACLE数据库的性能调整是个重要,却又有难度的话题,如何有效地进行调整,需要通过反反复复的过程。

在数据库建立时,就能依照顾用的需要合理设计分配表空间以及储备参数、内存使用初始化参数,对以后的数据库性能有专门大的益处,建立好后,又需要在应用中不断进行应用程序的优化和调整,这需要在大量的实践工作中不断地积存体会,从而更好地进行数据库的调优。

数据库性能调优的方法●调整内存●调整I/O●调整资源的争用咨询题●调整操作系统参数●调整数据库的设计●调整应用程序本文针对应用程序的调整,来讲明对数据库性能如何进行优化。

2表分区的应用关于海量数据的表,能够考虑建立分区以提高操作效率。

建立分区一样以关键字为分区的标志,也能够以其他字段作为分区的标志,但效率不如关键字高。

建立分区的语句在建表时能够进行讲明:create table TABLENAME(<field list>)partition by range (PutOutNo)(partition PART1 values lessthan (200312319999)partition PART2 values lessthan (200412319999)。

如此,在进行大部分数据查询,数据更新和数据插入时,Oracle自动判定操作应该在哪个分区进行,幸免了整表操作,提高了执行的效率3访咨询Table的方式ORACLE 采纳两种访咨询表中记录的方式:●全表扫描全表扫描确实是顺序地访咨询表中每条记录. ORACLE采纳一次读入多个数据块(database block)的方式优化全表扫描.●通过ROWID访咨询表能够采纳基于ROWID的访咨询方式情形,提高访咨询表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采纳索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访咨询ROWID的方法,因此那些基于索引列的查询就能够得到性能上的提高.4共享SQL语句数据库治理员必须在init.ora中为那个区域设置合适的参数,当那个内存区域越大,就能够保留更多的语句,因此被共享的可能性也就越大了.当向ORACLE 提交一个SQL语句,ORACLE会第一在这块内存中查找相同的语句.那个地点需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等).共享的语句必须满足三个条件:●字符级的比较:当前被执行的语句和共享池中的语句必须完全相同.例如:SELECT * FROM EMP;和下列每一个都不同SELECT * from EMP;Select * From Emp;SELECT * FROM EMP;●两个语句所指的对象必须完全相同:例如:用户对象名如何访咨询Jack sal_limit private synonymWork_city public synonymPlant_detail public synonymJill sal_limit private synonymWork_city public synonymPlant_detail table owner下列SQL语句不能在这两个用户之间共享.select max(sal_cap) from sal_limit;缘故每个用户都有一个private synonym - sal_limit , 它们是不同的对象下列SQL语句能在这两个用户之间共享.select count(*) from work_city where sdesc like 'NEW%';缘故:两个用户访咨询相同的对象public synonym - work_city下列SQL语句不能在这两个用户之间共享.select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id缘故:用户jack 通过private synonym访咨询plant_detail 而jill 是表的所有者,对象不同.两个SQL语句中必须使用相同的名字的绑定变量(bind variables)1.select pin , name from people where pin = :blk1.pin;select pin , name from people where pin = :blk1.pin;2.select pin , name from people where pin = :blk1.ot_ind;select pin , name from people where pin = :blk1.ov_ind;5选择最有效率的表名顺序例如: 表TAB1 16,384 条记录,表TAB2 1 条记录选择TAB2作为基础表(最好的方法)select count(*) from tab1,tab2选择TAB2作为基础表(不佳的方法)select count(*) from tab2,tab1假如有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.例如: EMP表描述了LOCA TION表和CA TEGORY表的交集.SELECT * FROM LOCATION L , CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN 将比下列SQL更有效率SELECT * FROM EMP E , LOCATION L , CATEGORY C WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN AND E.EMP_NO BETWEEN 1000 AND 20006WHERE子句中的连接顺序.ORACLE采纳自下而上的顺序解析WHERE子句,依照那个原理,表之间的连接必须写在其他WHERE条件之前, 那些能够过滤掉最大数量记录的条件必须写在WHERE子句的末尾.例如:(低效)SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(高效)SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;7SELECT子句中幸免使用’*’当在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用‘*’是一个方便的方法.但是,这是一个专门低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’依次转换成所有的列名, 那个工作是通过查询数据字典完成的, 这意味着将耗费更多的时刻.8减少访咨询数据库的次数当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量, 读数据块等等. 由此可见, 减少访咨询数据库的次数, 就能实际上减少ORACLE的工作量.例如,以下有三种方法能够检索出雇员号等于0342或0291的职员.方法1 (最低效)SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 342;SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 291;方法2 (次低效)DECLARECURSOR C1 (E_NO NUMBER) ISSELECT EMP_NAME,SALARY,GRADE FROM EMP WHERE EMP_NO = E_NO;BEGINOPEN C1(342);FETCH C1 INTO …,..,.. ;…..OPEN C1(291);FETCH C1 INTO …,..,.. ;CLOSE C1;END;方法3 (高效)SELECT A.EMP_NAME , A.SALARY , A.GRADE, B.EMP_NAME , B.SALARY ,B.GRADE FROM EMP A,EMP B WHERE A.EMP_NO = 342 AND B.EMP_NO = 291; 9使用DECODE函数来减少处理时刻使用DECODE函数能够幸免重复扫描相同记录或重复连接相同的表.例如:SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE‘SMITH%’;SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE‘SMITH%’;你能够用DECODE函数高效地得到相同结果S ELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%’;类似的,DECODE函数也能够运用于GROUP BY 和ORDER BY子句中.10整合简单,无关联的数据库访咨询假如有几个简单的数据库查询语句,能够把它们整合到一个查询中(即使它们之间没有关系)例如:SELECT NAME FROM EMP WHERE EMP_NO = 1234;SELECT NAME FROM DPT WHERE DPT_NO = 10 ;SELECT NAME FROM CAT WHERE CAT_TYPE = ‘RD’;上面的3个查询能够被合并成一个:SELECT , , FROM CAT C , DPT D , EMP E,DUAL X WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+)) AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+)) AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+)) ANDE.EMP_NO(+) = 1234 AND D.DEPT_NO(+) = 10 AND C.CAT_TYPE(+) = ‘RD’;尽管采取这种方法,效率得到提高,然而程序的可读性大大降低,因此依旧要权衡之间的利弊11删除重复记录最高效的删除重复记录方法( 因为使用了ROWID)DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);12用TRUNCATE替代DELETE当删除表中的记录时,在通常情形下, 回滚段(rollback segments ) 用来存放能够被复原的信息. 假如你没有COMMIT事务,ORACLE会将数据复原到删除之前的状态(准确地讲是复原到执行删除命令之前的状况)而当运用TRUNCATE时, 回滚段不再存放任何可被复原的信息.当命令运行后,数据不能被复原.因此专门少的资源被调用,执行时刻也会专门短.(注意:TRUNCA TE只在删除全表适用,TRUNCATE是DDL不是DML)13尽量多使用COMMIT只要有可能,在程序中尽量多使用COMMIT, 如此程序的性能得到提高,需求也会因为COMMIT所开释的资源而减少:COMMIT所开释的资源:●回滚段上用于复原数据的信息.●被程序语句获得的锁●redo log buffer 中的空间●ORACLE为治理上述3种资源中的内部花费14运算记录条数和一样的观点相反, count(*) 比count(1)稍快, 因此假如能够通过索引检索,对索引列的计数仍旧是最快的. 例如COUNT(EMPNO)(并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差不)15用Where子句替换HAVING子句幸免使用HA VING子句, HA VING 只会在检索出所有记录之后才对结果集进行过滤. 那个处理需要排序,总计等操作. 假如能通过WHERE子句限制记录的数目,那就能减少这方面的开销.例如:低效:SELECT REGION,A VG(LOG_SIZE) FROM LOCATION GROUP BY REGION HA VING REGION REGION != ‘SYDNEY’ AND REGION != ‘PERTH’高效SELECT REGION,AVG(LOG_SIZE) FROM LOCATION WHERE REGION REGION != ‘SYDNEY’ AND REGION != ‘PERTH’ GR OUP BY REGION (HA VING 中的条件一样用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一样的条件应该写在WHERE子句中)16减少对表的查询在含有子查询的SQL语句中,要专门注意减少对表的查询.例如:低效SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) AND DB_VER= ( SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)高效SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS WHERE VERSION = 604)Update 多个Column 例子:低效:UPDATE EMP SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES), SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES) WHERE EMP_DEPT = 0020;高效:UPDATE EMP SET (EMP_CAT, SAL_RANGE) = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE) FROM EMP_CATEGORIES) WHERE EMP_DEPT = 0020;17通过内部函数提高SQL效率.SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*) FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H WHERE H.EMPNO =E.EMPNO AND H.HIST_TYPE = T.HIST_TYPE GROUP BYH.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;通过调用下面的函数能够提高效率.FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN V ARCHAR2ASTDESC V ARCHAR2(30);CURSOR C1 ISSELECT TYPE_DESCFROM HISTORY_TYPEWHERE HIST_TYPE = TYP;BEGINOPEN C1;FETCH C1 INTO TDESC;CLOSE C1;RETURN (NVL(TDESC,’?’));END;FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN V ARCHAR2 ASENAME V ARCHAR2(30);CURSOR C1 ISSELECT ENAMEFROM EMPWHERE EMPNO=EMP;BEGINOPEN C1;FETCH C1 INTO ENAME;CLOSE C1;RETURN (NVL(ENAME,’?’));END;SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*) FROM EMP_HISTORY HGROUP BY H.EMPNO , H.HIST_TYPE;18使用表的不名(Alias)当在SQL语句中连接多个表时, 请使用表的不名并把不名前缀于每个Column上.如此一来,就能够减少解析的时刻并减少那些由Column歧义引起的语法错误.(Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中显现那个Column时,SQL解析器无法判定那个Column的归属)19用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情形下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.低效:SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)高效:SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)20用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并. 不管在哪种情形下,NOT IN差不多上最低效的(因为它对子查询中的表执行了一个全表遍历). 为了幸免使用NOT IN ,我们能够把它改写成外连接(Outer Joins)或NOT EXISTS.例如:SELECT … FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=’A’);为了提高效率.改写为:(方法一: 高效)SELECT …. FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) ANDB.DEPT_NO IS NULL AND B.DEPT_CAT(+) = ‘A’(方法二: 最高效)SELECT …. FROM EMP E WHERE NOT EXISTS (SELECT ‘X’ FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A’);21识不低效执行的SQL语句用下列SQL工具找出低效SQL:SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,SQL_TEXTFROM V$SQLAREAWHERE EXECUTIONS>0AND BUFFER_GETS > 0AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8ORDER BY 4 DESC;(尽管目前各种关于SQL优化的图形化工具层出不穷,然而写出自己的SQL工具来解决咨询题始终是一个最好的方法)22使用TKPROF 工具来查询SQL性能状态SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 那个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时刻等.这些数据将能够用来优化系统.设置SQL TRACE在会话级不: 有效ALTER SESSION SET SQL_TRACE TRUE设置SQL TRACE 在整个数据库有效仿, 必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数讲明了生成跟踪文件的名目(设置SQL TRACE第一要在init.ora中设定TIMED_STATISTICS, 如此才能得到那些重要的时刻状态. 生成的trace文件是不可读的,因此要用TKPROF工具对其进行转换,TKPROF有许多执行参数. 能够参考ORACLE手册来了解具体的配置. )23用EXPLAIN PLAN 分析SQL语句EXPLAIN PLAN 是一个专门好的分析SQL语句的工具,它甚至能够在不执行SQL 的情形下分析语句. 通过分析,我们就能够明白ORACLE是如何样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 假如两个操作处于同一层中,带有最小操作号的将被第一执行.(通过实践, 感到依旧用SQLPLUS中的SET TRACE 功能比较方便. )举例:SQL> list1 SELECT *2 FROM dept, emp3* WHERE emp.deptno = dept.deptnoSQL> set autotrace traceonly /*traceonly 能够不显示执行结果*/SQL> /14 rows selected.Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 NESTED LOOPS2 1 TABLE ACCESS (FULL) OF 'EMP'3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)Statistics----------------------------------------------------------0 recursive calls2 db block gets30 consistent gets0 physical reads0 redo size2598 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)14 rows processed通过以上分析,能够得出实际的执行步骤是:1. TABLE ACCESS (FULL) OF 'EMP'2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'4. NESTED LOOPS (JOINING 1 AND 3)注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具.也许喜爱图形化界面的能够选用它们.24实时批量的处理在我们的应用中,大部分是JSP操纵业务逻辑的编写,然而当业务逻辑比较复杂,复杂的情形有两种●牵涉的表逻辑处理比较多●牵涉的表数据处理量比较大这时尽量采纳数据库内建过程处理内建过程处理的优点:●内建过程是在数据库端执行的,sql语句的解析,数据的处理全部在内部完成,不需要额外的开销,效率能够提高。

相关文档
最新文档