首页 > 数据库 > Oracle > [转]DECODE和CASE的性能比较
DECODE和CASE的性能比较
===========================================================
作者:
发表于:
分类:
出处:
---------------------------------------------------------------
Oracle的DECODE函数功能很强,灵活运用的话可以避免多次扫描,从而提高查询的性能。而CASE是9i以后提供的语法,这个语法更加的灵活,提供了IF
对于很多情况,DECODE和CASE都能解决问题,个人更倾向于使用DECODE,一方面是从8i保留下来的习惯,另一方面是DECODE的语法更加的简洁,代码量要小一些。
不过今天在看Oracle9i的数据仓库手册时发现,Oracle在文档中提到CASE语句的效率会更高一些,尤其是CASE表达式
到底效率如何,还是要具体的实例来说:
SQL>
2
3
Table
SQL>
COUNT(*)
----------
6075760
下面检查DECODE和两种CASE语句的效率:
SQL>
SQL>
SQL>
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
46288564
67317
6077
0
0
6075760
SQL>
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
46288578
67317
6077
0
0
6075760
SQL>
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
46288585
67317
6077
0
0
6075760
测试结果确实是CASE的简单表达式写法效率最高,然后是CASE的另一种写法,DECODE效率最低。但是对于600W的记录,最终结果只有0.01到0.02秒的查询,实在没有办法得出上面的结论,因为这个差别实在是太小,以至于任何其他的一些影响都足以改变测试结果,如要一定要得出结论,那么结论就是3种方式的效率基本相同。
不过由于CASE表达式更加灵活,使得以前DECODE必须运用的一些技巧得以简化,这时使用CASE方式,确实可以得到一些性能上的提高,比如:
SQL>
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
31491431
67317
6077
0
0
6075760
SQL>
2
3
4
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
31491449
67317
6077
0
0
6075760
这里CASE带来性能提升的主要原因实际上是CASE避免了SIGN函数的调用,而并不是CASE本身的性能要高于DECODE,事实上如果这里使用SIGN并利用CASE的所谓高效语法:
SQL>
2
3
4
6075760
Elapsed:
Execution
----------------------------------------------------------
Plan
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------
Note
-----
-
Statistics
----------------------------------------------------------
0
0
47551
0
0
31491445
67317
6077
0
0
6075760
可以看到,这时效率比DECODE还低。
根据上面的测试可以得出结论,无论是DECODE还是CASE方式的两种写法,执行效率没有明显的差别。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21413571/viewspace-1117005/ ,如需转载,请注明出处,否则将追究法律责任。