ORACLE SQL性能优化系列 (五)

原创 2003年07月29日 08:17:00

17.       使用表的别名(Alias)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

 

(译者注: Column歧义指的是由于SQL中不同的表具有相同的Column,SQL语句中出现这个Column,SQL解析器无法判断这个Column的归属)

 

18.       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’)

 

 

 (译者按: 相对来说,NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出)

 

 

19.       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(+)

AND B.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’);

 

(待续)

ORACLE SQL性能优化系列 (五)

 17. 使用表的别名(Alias) 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. (译者...
  • hit040420224
  • hit040420224
  • 2008年12月05日 09:23
  • 229

ORACLE SQL性能优化系列(五)

7.     减少访问数据库的次数 当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 ...
  • hzfu007
  • hzfu007
  • 2006年09月13日 17:19
  • 644

ORACLE SQL性能优化系列 (五)@

17. 使用表的别名(Alias) 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. ...
  • zhaowei_ha
  • zhaowei_ha
  • 2014年01月21日 10:12
  • 520

ORACLE SQL性能优化汇总

ORACLE SQL性能优化汇总:SQL语句共享、ORACLE SQL 多表联合查询、where语句条件顺序、ORACEL多表连接查询指定表别名alias等...
  • tianwei7518
  • tianwei7518
  • 2015年03月11日 23:41
  • 1017

高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》

充分利用索引 索引的限制 1. 索引对不等号和NOT的限制   如果WHERE条件中出现!=或者 Oracle 10g起,在基于CBO的优化器模式下Oralce会进行自动优...
  • holandstone
  • holandstone
  • 2016年05月21日 23:36
  • 2013

ORACLE SQL性能优化系列 (五) (六)

17.       使用表的别名(Alias)当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误....
  • cwwhy
  • cwwhy
  • 2005年06月27日 12:59
  • 795

ORACLE SQL性能优化系列

 选择最有效率的表名顺序(只在基于规则的优化器中有效)        ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table...
  • meteorlWJ
  • meteorlWJ
  • 2008年06月16日 13:36
  • 534

ORACLE SQL性能优化系列

ORACLE SQL性能优化系列1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本)c. CHOOSE (选择性) 设置缺省的...
  • xianbin
  • xianbin
  • 2006年11月19日 14:55
  • 784

ORACLE SQL性能优化No3--ORACLE SQL性能优化系列

1. 选用适合的ORACLE优化器      ORACLE的优化器共有3种:     a.  RULE (基于规则)   b. COST (基于成本)  c. CHOOSE (选择性)      设置...
  • elimago
  • elimago
  • 2007年07月02日 12:31
  • 789

Oracle查询性能优化(面试题:数据库查询优化也是常问的问题)

原则一:注意WHERE子句中的连接顺序:  ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WH...
  • hxpjava1
  • hxpjava1
  • 2017年02月21日 11:40
  • 1193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE SQL性能优化系列 (五)
举报原因:
原因补充:

(最多只允许输入30个字)