30个Oracle语句优化规则详解(五)

2009-1-13    | |
打印本文章
RSS

导读:本篇主要回答用表连接替换EXISTS、如何用EXISTS替换DISTINCT、识别‘低效执行’的SQL语句以及如何使用TKPROF工具来查询SQL性能状态等。

关键词:Oracle Oracle语句优化 EXISTS TKPROF工具 SQL性能

正在加载数据...

20.用表连接替换EXISTS

通常来说,采用表连接的方式比EXISTS更有效率


SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT ‘X’
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A’); 

(更高效)


SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = ‘A’ ; 

(译者按:在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP)

21.用EXISTS替换DISTINCT

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换

例如:

低效:


SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO 

高效:

SELECT DEPT_NO,DEPT_NAME
FROM DEPT D
WHERE EXISTS ( SELECT ‘X’
FROM EMP E
WHERE E.DEPT_NO = D.DEPT_NO);
 

EXISTS使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。

22.识别‘低效执行’的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_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC; 

(译者按:虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

23.使用TKPROF工具来查询SQL性能状态

SQL trace工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中。这个跟踪文件提供了许多有用的信息,例如解析次数。执行次数,CPU使用时间等。这些数据将可以用来优化你的系统。

设置SQL TRACE在会话级别:

有效


ALTER SESSION SET SQL_TRACE TRUE

设置SQL TRACE在整个数据库有效仿,你必须将SQL_TRACE参数在init.ora中设为TRUE,USER_DUMP_DEST参数说明了生成跟踪文件的目录

(译者按:这一节中,作者并没有提到TKPROF的用法,对SQL TRACE的用法也不够准确,设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS,这样才能得到那些重要的时间状态。生成的trace文件是不可读的,所以要用TKPROF工具对其进行转换,TKPROF有许多执行参数。大家可以参考Oracle手册来了解具体的配置。)

24.用EXPLAIN PLAN 分析SQL语句

EXPLAIN PLAN是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句。通过分析,我们就可以知道Oracle是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。

你需要按照从里到外,从上到下的次序解读分析的结果。EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读,如果两个操作处于同一层中,带有最小操作号的将被首先执行。

NESTED LOOP是少数不按照上述规则处理的操作,正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理。

译者按:通过实践,感到还是用SQLPLUS中的SET TRACE功能比较方便。

举例:


SQL> list
1 SELECT *
2 FROM dept, emp
3* WHERE emp.deptno = dept.deptno
SQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/
SQL> /
14 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE
1 0 NESTED LOOPS
2 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 calls
2 db block gets
30 consistent gets
0 physical reads
0 redo size
2598 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 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工具。也许喜欢图形化界面的朋友们可以选用它们。


30个Oracle语句优化规则详解
 30个Oracle语句优化规则详解(一)
 30个Oracle语句优化规则详解(二)
 30个Oracle语句优化规则详解(三)
 30个Oracle语句优化规则详解(四)
 30个Oracle语句优化规则详解(五)
 30个Oracle语句优化规则详解(六)

原文出处:http://tech.it168.com/lists/0243/0/0243.shtml
来源:IT168    作者:gjm008     
  评论
相关的专家答疑
相关的白皮书
 
对于数据库管理员来说,在内存中进行排序总是比磁盘排序更受欢迎。所以说,磁盘排序是影响Oracle数据库性能的罪魁祸首。
 
如果要在Oracle数据库中使用中文字符,那么在安装操作系统时要安装中文语言包。并且在数据库所属的用户环境变量里指定所使用的中文字符集。
 
前文介绍了COPY_FILE,本文介绍这个包的另外两个过程,GET_FILE和PUT_FILE。这两个过程的功能和FTP的get和put命令是否类似,就是利用数据库的功能将文件在……
 
Oracle 10g新增了DBMS_FILE_TRANSFER包,通过数据库的功能实现了文件的传输,本篇主要介绍COPY_FILE过程。
 
Shared pool的优化应该放在优先考虑,因为一个cache miss在shared pool中发生比在data buffer中发生导致的成本更高,由于dictionary数据一般比library cache中…… 
在SQL Server中,我们如何进行索引设计来提升系统的性能和对查询进行优化,是许多用户非常关注的问题,在本次技术专题中,我们将分群集索引和非群集索引设计两部分来为您详细分析。
本技术专题主要为使用Oracle SQL Developer和其他开发工具。包括如何使用Oracle SQL Developer和其他开发工具、使用Oracle Database Home Page、在Oracle中使用SQL*Plus等方面。
本专题为QL SELECT语句基础。侧重概述了如何使用SELECT来访问SQL数据库中所有内容以及组成SELECT语句的许多子句名称和功能;同时还阐述了如何使用DISTINCT关键字消除重复的行,以及如何正确使用ORDER BY子句来排序数据。
最新更新
专家答疑
技巧
Brian Fedorko
Oracle数据库审计功能十分强大、灵活并且易于配置,适当并有效地使用数据库审计功能是拥有高效安全策略的基础。
Brian Peasland
Oracle数据库二进制文件和库文件是高版本版本的,而备份的数据库内部如果仍然是较低版本,那么Oracle将不允许你打开数据库,除非你完成了升级过程。
Maria Anderson
在Windows XP环境下,使用数据库升级助手将Oracle从9.2.0.1升级到10g R2,出现DBUA不能识别Oracle数据库的SID问题如何解决。

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录