学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> SQL >> Oracle SQL性能优化系列介绍(下)


Oracle SQL性能优化系列介绍(下)


6. SELECT子句中避免使用 ‘ * ‘

当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

7. 减少访问数据库的次数

当执行每条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 (次低效)

DECLARE 

CURSOR C1 (E_NO NUMBER) IS 

SELECT EMP_NAME,SALARY,GRADE 

FROM EMP 

WHERE EMP_NO = E_NO; 

BEGIN 

OPEN 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;
 

注意: 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200。













8. 使用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函数高效地得到相同结果

SELECT 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子句中。











9. 整合简单,无关联的数据库访问

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

例如:

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 E.NAME , D.NAME , C.NAME 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(+)) 
AND E.EMP_NO(+) = 1234 
AND D.DEPT_NO(+) = 10 
AND C.CAT_TYPE(+) = ‘RD';

(译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者 还是要权衡之间的利弊)

10. 删除重复记录

最高效的删除重复记录方法 ( 因为使用了ROWID)

DELETE FROM EMP E 
WHERE E.ROWID >(SELECT MIN(X.ROWID) 
FROM EMP X 
WHERE X.EMP_NO = E.EMP_NO);
 

 

11. 用TRUNCATE替代DELETE

当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) ,而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短。(注: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)

12. 尽量多使用COMMIT

只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少,COMMIT所释放的资源:

a. 回滚段上用于恢复数据的信息。

b. 被程序语句获得的锁。

c. redo log buffer 中的空间。

d. Oracle为管理上述3种资源中的内部花费。

(注:在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)

(T115)

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"Oracle SQL性能优化系列介绍(下)"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 Oracle SQL性能优化系列介绍(下) 相关内容
Google搜索中 Oracle SQL性能优化系列介绍(下) 相关内容
雅虎中 Oracle SQL性能优化系列介绍(下) 相关内容
Sogou搜索中 Oracle SQL性能优化系列介绍(下) 相关内容

相关软件 最新回复帖子:

·nesox让电子邮件营销原来如此轻松!
·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描


  相关软件 Oracle SQL性能优化系列介绍(下)相关文章
Oracle SQL性能优化系列介绍(上) SQL Stored Procedures 的破解工具
用SQL*Loader将Excel数据导出到Oracle 教您 SQL SERVER 2005 同步复制技术
Windows 2003不太喜欢SQL Server2000 MYSQL,Oracle,SQL数据库在JSP中的驱动
SQL Server 和 Oracle 常用函数对比 一个有关多条件数据库查询的优化方法
用ADO管理SQL Server数据库及其设备 通用SQL数据库查询语句精华使用简介
Oracle中捕获问题SQL解决CPU过渡消耗 如何在Oracle数据库10g中跟踪SQL
SQL Server对文件内容进行全文检索查询 ORACLE中常用的SQL语法和数据对象
Oracle中使用SQL MODEL定义行间计算 在MySQL中执行SQL语句时的几个注意点
向你谈谈SQLPlus中的复制和粘贴技巧 热点关注:IBM将与微软开始激烈对决
关于SQL Server数据库的若干注意事项 50种方法巧妙优化你的SQL Server数据库