a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 106|回复: 0

[考试辅导] Oracle性能调优:如何对Oracle中的优化器进行评估优化

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
Oracle优化器在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是:! `- Y# a* q7 O' E6 G3 X! d
    ·要么结果表达式能够比源表达式具有更快的速度。
9 N8 i/ U. n- b    ·要么源表达式只是结果表达式的一个等价语义结构。* F$ e0 L, r! V& n3 o
    不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),Oracle会把他们映射到一个单一的语义结构。' D. k" M! U) \2 g6 U; H6 W
    下面将讨论优化器如何评估优化如下的情况和表达式:
- w+ _% z( T! N6 E3 L    常量 LIKE 操作符 IN 操作符 ANY和SOME 操作符 ALL 操作符 BETWEEN 操作符 NOT 操作符
! s4 U% T4 r; e9 }    传递(Transitivity) 确定性(DETERMINISTIC)函数
; h, T# C" O( Z+ S4 v- s5 H    常量: k: u* @# u( Y
    常量的计算是在语句被优化时一次性完成,而不是在每次执行时。下面是检索月薪大于2000的的表达式: · sal > 24000/12
1 m4 M9 W9 a4 V( d0 V    · sal > 2000( f+ D4 T: [( @  j$ C
    · sal*12 > 24000
+ w1 l3 s  v5 G+ i* O    如果SQL语句包括第一种情况,优化器会简单地把它转变成第二种。5 I, `1 B1 z: x
    注意:优化器不会简化跨越比较符的表达式,例如第三条语句,鉴于此,应用程序开发者应该尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。7 j3 U% `6 b' k' |( P
    LIKE 操作符2 N% q0 z- }6 Q) W
    优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。
7 t& R1 q( A4 Y; Q- C    例如:优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH'优化器只能转换涉及到可变长数据类型的表达式,前一个例子中,如果ENAME字段的类型是CHAR(10), 那么优化器将不做任何转换。
5 @) f9 m6 a" U% k% c/ K    IN 操作符7 J) z& @+ |; `; i  B
    优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。例如,优化器会把表达式ename IN ('SMITH','KING','JONES')替换为: ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES'
  \' I* Y. y: Y    ANY和SOME 操作符3 u- n8 [) O" h  N3 [7 o) h# U6 I9 O
    优化器将跟随(following)值列表的ANY和SOME检索条件用等价的同等操作符和“OR”组成的表达式替换。
) D9 p; A/ F) P" X$ I, d    例如,优化器将如下所示的第一条语句用第二条语句替换: · sal > ANY (:first_sal, :second_sal)
% {' u( d3 k# e, U    · sal > :first_sal OR sal > :second_sal! O" ~  n' q& z/ q2 t/ N' {, F
    优化器将跟随子查询的ANY和SOME检索条件转换成由“EXISTS”和一个相应的子查询组成的检索表达式。4 D! H8 U7 d, H' E
    例如,优化器将如下所示的第一条语句用第二条语句替换: · x > ANY (SELECT sal FROM emp WHERE job = 'ANALYST')
7 E! q! m. \, D" G    · EXISTS (SELECT sal FROM emp WHERE job = 'ANALYST' AND x > sal)
; t7 o, ]# A. L- |, |    ALL 操作符. s8 z6 A* E& N% g
    优化器将跟随值列表的ALL操作符用等价的“=”和“AND”组成的表达式替换。
4 k, a9 N5 j: O! I    例如,sal > ALL (:first_sal, :second_sal)表达式会被替换为: sal > :first_sal AND sal > :second_sal; B! U3 x6 p' `& z; R. Y
    对于跟随子查询的ALL表达式,优化器用ANY和另外一个合适的比较符组成的表达式替换。例如,优化器会把表达式 x > ALL (SELECT sal FROM emp WHERE deptno = 10) 替换为: NOT (x 、=之中的任何一个,常量是指任何一个涉及了操作符、SQL函数、文字、绑定变量(bind variables)或者关联变量(correlation variables)的常量表达式。
5 Y: Y& `3 K: ~' A7 j: o$ w    例如,考虑这样一个包含两个各自使用了字段EMP.DEPTNO的检索条件的WHERE子句的查询: SELECT * FROM emp, dept WHERE emp.deptno = 20 AND emp.deptno = dept.deptno;
& _/ g* v% v7 ]# P& e$ g8 Q    使用传递优化,优化器会推断出如下条件:dept.deptno = 20。如果有索引存在于EMP.DEPTNO字段上,这个条件会使调用这个索引的接口路径有效。注意:优化器只能对字段关联常量的表达式进行推断,而不是 字段关联字段的表达式。例如,包含这样条件的WHERE子句:字段1 字段3 AND 字段1 = 字段2,这种情况不能推断出表达式:字段2 < comp_oper> 字段3。, d! _- U% A3 \7 c
    确定性(DETERMINISTIC)函数+ W6 |' k$ G. f" I- m- l" S
    在某些情况下,优化器能够使用先前的函数返回结果而不是重新执行用户定义的函数,这仅仅对那些以限制的方式来执行的函数来说是有效的。这些函数必须 对任何的输入都有同样的返回值,函数的结果必须不能因为包(PACKAGE)变量、数据库或会话(SESSION)的参数(例如NLS参数)不同而变化, 如果函数在将来重新定义,返回值必须对任何参数来说仍然与以前的返回值相同。函数的创建者可以在以CREATE FUNCTION、CREATE PACKAGE或者CREATE TYPE声明函数时根据以上的要求使用DETERMINISTIC关键字向数据库申明该函数为确定性函数,数据库不会对确定性函数的合法性进行校验,即使 一个函数明显的使用了包变量或操作了数据库,仍然可以被定义为确定性函数,这就是说如何安全合法的使用和定义确定性函数是程序员的责任。
: s! L( Q4 R; r) K  g7 d9 v    当确定性函数在同一个查询里被多次调用,或者被基于函数的索引或物化视图(materialized view)调用时,有可能被一个已经计算出的值取代。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-27 05:23 , Processed in 0.292258 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表