SQL> set serverout on; SQL> select 1 from dual where f1('1')='1' and f2('1')='1';
( ~( g& s" w$ d5 e& E, M 1
& |: I* K/ \0 |$ B' ? ----------
, W1 ?5 f7 ]7 J! I. L+ a) q 1 i7 y) R$ d% U7 M% f1 q; V7 O
exec F2' d% g% V* J2 f
exec F13 i0 s! v2 {2 [4 s9 J
SQL> select 1 from dual where f2('1')='1' and f1('1')='1';
6 S E/ y# d$ w9 z9 ? 1
! `- M: E+ B+ a0 V* G! y: a- l8 I ----------
2 ~# ?6 c$ ?) q4 @4 H9 h 1
: E+ x: \! L% }, I4 e exec F1. d( E) Y1 R0 a9 I, N9 Z
exec F2, U. B! ]. O% h" o
结果表明,SQL条件的执行顺序是从右到左的。9 ]- l( G, R3 i
那么,根据这个结果来分析,把能使结果最少的条件放在最右边,是否会减少其它条件执行时所用的记录数量,从而提高性能呢?$ C9 G- M" k1 i! ~% K5 h
例如:下面的SQL条件,是否应该调整SQL条件的顺序呢?
$ Z( E0 K7 l, p Where A.结帐id Is Not Null
6 ^1 X; P W [, H3 o And A.记录状态0& ?& |+ r7 L9 k; ~9 i2 Y
And A.记帐费用=1! U: e/ r0 o6 j/ e$ z
And (Nvl(A.实收金额, 0)Nvl(A.结帐金额, 0) Or Nvl(A.结帐金额, 0)=0)
6 J! b3 h7 @% R1 H+ y2 l And A.病人ID=[1] And Instr([2],','||Nvl(A.主页ID,0)||',')>0
. U9 O4 `- o n4 \1 J5 @9 F9 F1 b And A.登记时间Between [3] And [4]
. a+ M3 w' T! A5 n$ V And A.门诊标志1
6 _- y0 ~: I: M9 n. a/ R 实际上,从这条SQL语句的执行计划来分析,Oracle首先会找出条件中使用索引或表间连接的条件,以此来过滤数据集,然后对这些结果数据块所涉及的记录逐一检查是否符合所有条件,所以条件顺序对性能几乎没有影响。
, q s6 B c6 C$ K; I3 n 如果没有索引和表间连接的情况,条件的顺序是否对性能有影响呢?再来看一个实验。
9 _7 _* t( V- f 实验四:证明了条件的顺序对性能没有影响。
* u% u6 }* i) a- \. z* t8 } SQL> select count(*) from诊疗项目目录where操作类型='1';
1 C6 _$ H8 L2 {% }. F. x5 d COUNT(*)' x& R$ @0 |: |: E" H% b9 {
----------
+ @0 y3 s2 A- |2 ^8 w' f 3251" i( r, E; J% O# r
SQL> select count(*) from诊疗项目目录where类别='Z';$ M' M$ D3 } k
COUNT(*)
6 M1 |; L' n% s. g1 l5 Z ---------- |