- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一、PL/SQL性能问题的原由
当基于PL/SQL的应用程序执行效率低下时,通常是由于糟糕的SQL语句、编程方法,对PL/SQL基础掌握不好或是滥用共享内存造成的。
PL/SQL中糟糕的SQL语句
PL/SQL编程看起来相对比较简单,因为它们的复杂内容都隐藏在SQL语句中,SQL语句常常分担大量的工作。这就是为什么糟糕的SQL语句是执行效率低下的主要原因了。如果一个程序中包含很多糟糕的SQL语句,那么,无论PL/SQL语句写的有多么好都是无济于事的。
如果SQL语句降低了我们的程序速度的话,就要按下面列表中的方法分析一下它们的执行计划和性能,然后重新编写SQL语句。例如,查询优化器的提示就可能会排除掉问题,如没有必要的全表扫描。
EXPLAIN PLAN语句
使用TKPROF的SQL Trace功能
Oracle Trace功能
不好的编程习惯
通常,不好的编程习惯也会给程序带来负面影响。这种情况下,即使是有经验的程序员写出的代码也可能妨碍性能发挥。
对于给定的一项任务,无论所选的程序语言有多么合适,编写质量较差的子程序(例如,一个很慢的分类或检索函数)可能毁掉整个性能。假设有一个需要被应用程序频繁调用的查询函数,如果这个函数不是使用哈希或二分法,而是直接使用线性查找,就会大大影响效率。不好的程序指的是那些含有从未使用过的变量的,传递没有必要的参数的,把初始化或计算放到不必要的循环中执行的程序等等。
内置函数的重复
PL/SQL提供了许多高度优化过的函数,如REPLACE、TRANSLATE、SUBSTR、INSTR、RPAD和LTRIM等。不要手工编写我们自己的版本,因为内置函数已经是很高效的了。即使内置函数的功能远远超过我们的需要,也不要手工实现它们功能的子集。
低效的流程控制语句
在计算逻辑表达式值的时候,PL/SQL使用短路的计算方式。也就是说,一旦结果可以被确定下来,PL/SQL就会停止剩余的表达式计算。例如,下面的OR表达式,当sal比1500小的时候,操作符左面的值就是TRUE,所以PL/SQL就不会再计算操作符右边表达式的值:
IF (sal 1500) OR (comm IS NULL) THEN
...
END IF;
现在,思考下面的AND表达式:
IF credit_ok(cust_id) AND (loan 5000) THEN
...
END IF;
在上面的函数中,布尔函数credit_ok总是被调用。但是,如果我们向下面这样调换两个表达式的位置:
IF (loan 5000) AND credit_ok(cust_id) THEN
...
END IF;
那么,函数只有在表达式loan 5000的值为TRUE的时候才会被调用,这种情况也适用于EXIT-WHEN语句。
隐式的数据类型转换
运行时,PL/SQL能把结构化不同的数据类型进行隐式的转换。比如说,把PLS_INTEGER变量赋给一个NUMBER变量,由于它们的内在表现形式不一样,所以就会引起隐式地数据类型转换。
避免隐式的类型转换可以改善性能。如下面的例子,15是一个有符号的4字节数字,在加法运算之前,PL/SQL必须把它转换成Oracle的数字类型。但是,浮点数15.0使用22字节的Oracle数字表现,所以就没有必要进行转换。
DECLARE
n NUMBER;
c CHAR(5);
BEGIN
n := n + 15; -- converted
n := n + 15.0; -- not converted
...
END;
这里还有一个例子:
DECLARE
c CHAR(5);
BEGIN
c := 25; -- converted
c := 25; -- not converted
...
END;
不适当的数字类型声明
数据类型NUMBER和它的子类型都是22字节,数据库格式的数字,它们便于移植并且能适应于不同的长度与精度。当我们需要声明一个整型变量时,就要使用PLS_INTEGER,它是最高效的数字类型。这是因为PLS_INTEGER所需的内存要比INTEGER和NUMBER类型要少。同样,PLS_INTEGER使用机器运算,所以它的运算速度要比BINARY_INTEGER、INTEGER或NUMBER快得多。
此外,INTEGER、NATURAL、NATURALN、POSITIVE、POSITIVEN和SIGNTYPE都是受约束的子类型。所以,它们的变量需要在运行时检查精度,这就会影响到效率。
不必要的NOT NULL约束
PL/SQL中,使用NOT NULL约束也能导致性能损耗。如下
您可能关注的文档
- 新郑太极物业管理方案.doc
- 方策公司软件开发部绩效考核方案.doc
- 新农村文化建设中新田县民间乐队发展现状调查报告.doc
- 新钢公司第一炼钢厂相关方安全管理协议.doc
- 施工升降机安拆方案交底.docx
- 施工升降机安装拆卸安全协议和合同.doc
- 施工电梯安全旁站方案.doc
- 施工电梯安装方案01.doc
- 施工电梯施工方案改doc2.doc
- 月度绩效考核管理办法(分公司初稿).doc
- 10《那一年,面包飘香》教案.docx
- 13 花钟 教学设计-2023-2024学年三年级下册语文统编版.docx
- 2024-2025学年中职学校心理健康教育与霸凌预防的设计.docx
- 2024-2025学年中职生反思与行动的反霸凌教学设计.docx
- 2023-2024学年人教版小学数学一年级上册5.docx
- 4.1.1 线段、射线、直线 教学设计 2024-2025学年北师大版七年级数学上册.docx
- 川教版(2024)三年级上册 2.2在线导航选路线 教案.docx
- Unit 8 Dolls (教学设计)-2024-2025学年译林版(三起)英语四年级上册.docx
- 高一上学期体育与健康人教版 “贪吃蛇”耐久跑 教案.docx
- 第1课时 亿以内数的认识(教学设计)-2024-2025学年四年级上册数学人教版.docx
文档评论(0)