SQL> set serverout on; SQL> select 1 from dual where f1('1')='1' and f2('1')='1';* h8 |' r1 g2 u& I0 R* `6 d1 _
1
# S2 w2 l6 |0 B g. s# O A3 Z ----------
) B5 i; p( c! p9 P 1% s3 S7 H# }7 E, i6 j
exec F2
- Y6 ^6 g2 F0 M, ?; X; G( ^ exec F19 s) R# v6 V/ A* W$ I
SQL> select 1 from dual where f2('1')='1' and f1('1')='1';$ S- R6 J" w3 S( A$ m6 ^
13 m) j+ @% N2 ?# b
----------
- o# H% }( Y* n# @ 1
) O3 o5 v; i9 h) }- A+ ~5 `: G exec F1* J- {/ Q. i- F% L% m& B+ ?
exec F29 J4 g3 P5 S; F1 o) Y0 x; [
结果表明,SQL条件的执行顺序是从右到左的。) s+ Y8 g. a$ c+ ~. v
那么,根据这个结果来分析,把能使结果最少的条件放在最右边,是否会减少其它条件执行时所用的记录数量,从而提高性能呢?
3 v* e" E- S. z; ~/ Y& ~# ]! z 例如:下面的SQL条件,是否应该调整SQL条件的顺序呢?: T, @/ i6 N9 k3 K; A
Where A.结帐id Is Not Null
- ~, z) A; j: ~ ^. Y And A.记录状态0
5 c: k+ n2 ]9 U) f; ?. K And A.记帐费用=1
Z. C8 ]; }4 |" R4 d' I# p0 O And (Nvl(A.实收金额, 0)Nvl(A.结帐金额, 0) Or Nvl(A.结帐金额, 0)=0)
_, q" Y3 j2 \4 M$ q2 ^" Z% u And A.病人ID=[1] And Instr([2],','||Nvl(A.主页ID,0)||',')>02 w: H- p$ M" K4 m* V( K7 f. H
And A.登记时间Between [3] And [4]
$ P$ Z! M4 L1 |4 Z& P7 v And A.门诊标志1
* |# F* S; { \$ P 实际上,从这条SQL语句的执行计划来分析,Oracle首先会找出条件中使用索引或表间连接的条件,以此来过滤数据集,然后对这些结果数据块所涉及的记录逐一检查是否符合所有条件,所以条件顺序对性能几乎没有影响。( I4 g% C# N; W+ ?" X5 u
如果没有索引和表间连接的情况,条件的顺序是否对性能有影响呢?再来看一个实验。
8 ]7 ~. P: `# G2 o$ W6 i 实验四:证明了条件的顺序对性能没有影响。, f6 u0 W4 A$ i) t
SQL> select count(*) from诊疗项目目录where操作类型='1';
3 B8 r- L; k. p- [6 ~ COUNT(*)+ I4 T- k6 G7 x
----------
# z% }* C# l) e 3251' Q O9 J' A, @; F9 O& d
SQL> select count(*) from诊疗项目目录where类别='Z';
5 R8 ?2 U, |& W7 w/ y COUNT(*)
9 O) u: \' ]' ]$ u* S$ } ---------- |