2022年PLSQL程序优化和性能测试技巧.docx
《2022年PLSQL程序优化和性能测试技巧.docx》由会员分享,可在线阅读,更多相关《2022年PLSQL程序优化和性能测试技巧.docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PLSQL 程序优化和性能分析方法沈阳东软软件股份有限公司文件编号:TD文档编号版本号1 0分册名称第 册/共 册总页数编制张悦正文审批附录生效日期沈阳东软软件股份有限公司版本号更换条款及内容更换人审批人更换日期1. 前言 31.1 目的 31.2 文档说明 31.3 词汇表 41.4 参考资料 42. PLSQL程序优化原就 42.1 导致性能问题的内在缘由42.2 PLSQL 优化的核心思想42.3 ORACLE优化器 52.4 PLSQL 优化 62.4.1 挑选最有效率的表名次序62.4.2 WHERE子句中的连接次序62.4.3 SELECT子句中防止使用 *6 2.4.4 用 EX
2、ISTS 替代 IN72.4.5 用 NOT EXISTS替代 NOT IN72.4.6 用表连接替换 EXISTS82.4.7 用 EXISTS 替换 DISTINCT82.4.8 削减对表的查询 92.4.9 防止循环(游标)里面嵌查询92.4.10 尽量用 union all 替换 union112.4.11 使用 DECODE函数来削减处理时间112.4.12 group by优化 112.4.13 尽量防止用 order by122.4.14 用 Where 子句替换 HAVING子句 122.4.15 使用表的别名 Alias122.4.16 删除重复记录122.4.17 COMM
3、IT使用 132.4.18 削减多表关联132.4.19 批量数据插入132.5 索引使用优化 142.5.1 防止在索引列上使用函数或运算142.5.2 防止转变索引列的类型.152.5.3 防止在索引列上使用NOT152.5.4 用=替代 152.5.5 防止在索引列上使用IS NULL和 IS NOT NULL162.5.6 带通配符( %)的 like 语句 162.5.7 总是使用索引的第一个列 162.5.8 多个公平的索引 172.5.9 不明确的索引等级 172.5.10 自动挑选索引 172.5.11 使用提示 Hints172.5.12 表上存在过旧的分析 182.5.13
4、 表上存在并行 182.5.14 关于索引建立 183. PLSQL程序性能问题测试方法 193.1 性能问题分析 193.2 E XPAIN PLAN 分析索引使用 203.3 TOPSQL分析 213.4 针对性语句搜寻 253.5 后台储备过程跟踪 263.6 性能监控 错误!未定义书签;4. 性能测试工具设计思想错误!未定义书签;1. 前言1.1 目的性能测试是测试中比较重要的工作,性能测试应分为压力的测试和性能的测试,其中性能问题中绝大部分都是由于程序编写的不合理、不规范造成的;本文档说明白程序中常见的不优化的脚本编写,导致的性能问题,并且在也描述了怎样去跟踪和解决程序上的性能问题的
5、方法;在最终一章里面描述了做一个白盒测试工具测试性能问题的设计思想;1.2 文档说明本文档只说明PLSQL 编写的优化问题,不包括ORACLE 本身的性能优化(内存SGA、系统参数、表空间等)、操作系统的性能问题和硬件的性能问题;对于PLSQL 程序优化方面的内容有很多,本文档列出在我们实际工作中一些常见的情形;本文档难免有不正确的地方,也需要大家赐予指正;本文档举例说明的问题语句不是实际程序中真正存在的,只是让大家能看起来更简单懂得,但这些语句也不代表在我们程序中其他部分语句不存在这些问题;举例说明中的语句采纳的是社保核心平台的数据字典,在举例描述中没有标明表名和字段名的含义,仍需单独参考;
6、词汇名称词汇含义备注1.4 参考资料1.3 词汇表编号资料名称作者日期出版单位1ORACLE SQ性L 能优化系列232. PLSQL 程序优化原就2.1 导致性能问题的内在缘由导致系统性能显现问题从系统底层分析也就是如下几个缘由:CPU 占用率过高,资源争用导致等待内存使用率过高,内存不足需要磁盘虚拟内存IO 占用率过高,磁盘拜访需要等待2.2 PLSQL 优化的核心思想PLSQL 优化实际上就是防止显现“导致性能问题的内在缘由”,实际上编写程序,以及性能问题跟踪应当本着这个核心思想去考虑和解决问题;PLSQL 程序占用 CPU 的情形系统解读 SQL 语句执行,会消耗 CPU 的使用运算(
7、运算)会消耗 CPU 的使用PLSQL 程序占用内存的情形读写数据都需要拜访内存 内存不足时,也会使用磁盘PLSQL 程序增大 IO 的情形读写数据都需要拜访磁盘 IO读取的数据越多, IO 就越大大家都知道 CPU 现在都很高,运算速度特别快;拜访内存的速度也很快;但磁盘的访问相对前两个相比速度就差的特别大了,因此PLSQL 性能优化的重点也就是削减IO 的瓶颈,换句话说就是尽量削减 IO 的拜访;性能的优先级 CPU-内存 -IO ,影响性能的因素依次递增;依据上面的分析,PLSQL优化的核心思想为:1. 防止过多复杂的 SQL 脚本,削减系统的解读过程2. 防止过多的无用的运算,例如:死
8、循环3. 防止铺张内存空间没有必要的SQL 脚本,导致内存不足4. 内存中运算和拜访速度很快5. 尽可能的削减磁盘的拜访的数据量,该原就是PLSQL 优化中重要思想;6. 尽可能的削减磁盘的拜访的次数,该原就是PLSQL 优化中重要思想;下面的章节详细介绍常见影响性能的SQL 语句情形;2.3 ORACLE 优化器ORACLE的优化器:a.RULE 基 于 规 就 b.COST 基 于 成 本 c.CHOOSE 选 择 性 设置缺省的优化器 ,可以通过对 init.ora 文件中 OPTIMIZER_MODE参数的各种声明 ,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_R
9、OWS. 你当然也在SQL 句级或是会话session级对其进行覆盖.为了使用基于成本的优化器 CBO, Cost-Based Optimizer , 你必需常常运行 analyze 命令,以 增 加 数 据 库 中 的 对 象 统 计 信 息 objectstatistics 的 准 确 性 .假如数据库的优化器模式设置为挑选性CHOOSE,那么实际的优化器模式将和是否运 行过 analyze命令有关 . 假如 table 已经被 analyze 过, 优化器模式将自动成为 CBO , 反之, 数据库将采用RULE形式的优化器. 在缺省情形下 ,ORACLE 采纳 CHOOSE 优化器 ,
10、为了防止那些不必要的全表扫描full table scan , 你必需尽量防止使用 CHOOSE 优化器,而直接采纳基于规章或者基于成本的优化器.选择ac01作select count* from ab01,ac012.4.2 WHERE 子句中的连接ORACLE采纳自下而上的顺条件之前例如 :为执行时间次序序解读基础表26.09 秒WHERE 子句 ,依据这个原理不好的方,表之间的连接必需写在其他法WHERE2.4.3 SELECT 子句中防止使用 *的是 ,这是一个特别低效的方法. 实际上 ,ORACLE 在解读的过程中 , 会将 * 依次转换成全部的列名作是通过查询数据字典完成的, 这意
11、味着将耗费更多的时间;方法 .不幸, 这个工在 oracle10g 前默认的优化模式是 CHOOSE, 10g 默认是 ALL_ROWS ,我不建议大家去改动 ORACLE 的默认优化模式;2.4 PLSQL 优化主要说明白在 SQL 编写上和 PLSQL 程序编写上可以优化的地方;2.4.1 挑选最有效率的表名次序只在基于规章的优化器rule 中有效,目前我们oracle 挑选的优化器基本都不挑选rule ,因此该问题基本不会显现,但为了安全和规范起见,建议编程习惯采纳该规章;ORACLE的解读器依据从右到左的次序处理FROM 子句中的表名 ,因此 FROM 子句中写在最终的表基础表 dri
12、ving table 将被最先处理 . 在 FROM 子句中包含多个表的情形下,你必需挑选记录条数最少的表 作为基础表 .当 ORACLE处理多个表时 , 会运用排序及合并的方式连接它们.第一,扫描第一个表 FROM子句中最终的那个表 并对记录进行派序,然后扫描其次个表 FROM子句中最终其次个表 ,最终将全部从其次个表中检索出的记录与第一个表中合适记录进行合并.例如:表表ac01ab01有有116,384条条记记录录选择ab01作为基础表好的方法selectcount*fromac01,ab01执行时间0.96秒SELECT低ab01.aab001,ab02.aab051FROM效ab01,
13、ab02WHEREab02.aae140=31ANDab01.aab001=ab02.aab001; SELECTWHERE ab01.aab001=ab02.aab001高ab01.aab001,ab02.aab051FROM AND ab02.aae140= 31;效ab01,ab02当你想在 SELECT 子句中列出全部的COLUMN时,使用动态 SQL 列引用 *是一个便利的2.4.4 用 EXISTS 替代 IN实际情形看,使用exists 替换 in 成效不是很明显,基本一样;在很多基于基础表的查询中,为了满意一个条件, 往往需要对另一个表进行联接. 在这种情形下, 使用EXIST
14、S或NOTEXISTS通常将提高查询的效率.低效:SELECT*FROM ac01Where aac001 in select aac001 from ac02 where aab001=str_aab001 and aae140=31;或SELECT*FROM ac01Where aac001 in select distinct aac001 from ac02 where aab001=str_aab001 and aae140= 31;注意使用distinct也会影响速度高效:SELECT*FROM ac01Where exists select 1 from ac02 where a
15、ac001=ac01.aac001 and aab001=str_aab001 and aae140=31; in 的常量列表是优化的 例如: aab019 in 20,30,不用 exists 替换; in 列表相当于 or2.4.5 用 NOT EXISTS 替代 NOT INOracle 在 10g 之前版本 not in 都是最低效的语句,虽然在10g 上 not in 做到了一些改进,但仍旧仍是存在一些问题,因此我们肯定要使用not exists 来替代 not in 的写法;在子查询中 ,NOT IN 子句将执行一个内部的排序和合并. 无论在哪种情形下 ,NOT IN 都是最低效的
16、 由于它对子查询中的表执行了一个全表遍历. 为了防止使用NOTIN,我们可以把它改写成NOT EXISTS.例如:SELECT*FROMac01WHEREaab001NOTINSELECTaab001fromab01whereaab020=100;为了提高效率.改写为: SELECT*FROMac01WHERE not exists SELECT 1 from ab01 where aab001=ac01.aab001 and aab020= 100 ;2.4.6 用表连接替换 EXISTS在子查询的表和主表查询是多对一的情形,一般采纳表连接的方式比EXISTS更有效率;例如:低效:SELEC
17、TFROMac01.*ac01Wherewhereexistsselect1fromac02aac001=ac01.aac001andandaab001=ac01.aab001aae140=31and aae041=202101;高效:SELECTac01.* FROMac02,ac01Whereac02.aac001=ac01.aac001andac02.aab001=ac01.aab001andac02.aae140=31and aae041=202101;究竟 exists 和表关联哪种效率高,其实是依据两个表之间的数据量差别大小是有关的,假如差别不大实际上速度基本差不多;2.4.7 用
18、 EXISTS 替换 DISTINCT当提交一个包含一对多表信息比如个人基本信息表和个人参保信息表的查询时 ,防止在 SELECT子句中使用DISTINCT.一般可以考虑用EXISTS替换例如:低效:selectdistinctac01.aac001fromac02,ac01whereac02.aac001=ac01.aac001and andac01.aab001=100100ac02.aae140=31;高效:selectac01.aac001fromac01whereexistsselect1fromac02whereaac001=ac01.aac001andaae140=31and a
19、c01.aab001=100100 ;EXISTS 使查询更为快速 ,由于 RDBMS 核心模块将在子查询的条件一旦满意后,马上返回结果;因此假如不是特殊讨论和追求速度的话(例如:数据转换),查询一个表的数据需要关联其他表的这种情形查询,建议采纳EXISTS 的方式;2.4.8 削减对表的查询该问题是我们编程中显现过的问题,请大家肯定留意,并且该类问题优化可以带来较大性能的提升;例如:低效 cursor cur_kc24_mz is Select akc260from kc24where akb020 =str_akb020 and aka130=11;cursor cur_kc24_zy i
20、s Select akc260 from kc24where akb020 =str_akb020 and aka130=21;for rec_mz in cur_kc24_mz loop门诊处理 . end loop ;for rec_mz in cur_kc24_zy loop住院处理 . end loop ;高效 cursor cur_kc24 is Select akc260,aka130 from kc24where akb020 =str_akb020 and aka130 in 11,21 ;for rec_kc24 in cur_kc24 loopif rec_kc24.aka
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 PLSQL 程序 优化 性能 测试 技巧
限制150内