对于一些简单的逻辑测试,可以使用CASE WHEN和DECODE语法实现相同的功能。这里有什么方法更好(需要论证/测量)?
SUM(CASE WHEN xyz=100 THEN 1 ELSE 0 END)
或
SUM(DECODE(xyz,100,1,0))
答案 0 :(得分:2)
在多个条件检查的case
中,与Case
相比,Decode
更易于编写。此外,Decode
不能用于可能CASE
的PL / SQL代码中。
同一平台上CASE
和DECODE
之间的性能差异非常小。一个人必须运行100次1000次迭代才能看到差异,即便如此,这种差异是否仅仅归因于CASE
vs DECODE
还是存在争议。
CASE
和DECODE
之间的性能似乎有所不同,具体取决于CPU的类型。在某些CPU架构上,DECODE
似乎会稍快一些。在其他人看来,CASE
似乎会稍快一点。
性能差异非常小,因此将其用作是否使用CASE
或DECODE
的主要标准毫无意义。因此,除非你从一个非常紧密的循环中调用这个语句进行数百万次迭代,否则决定应该选择最适合需要的CASE或DECODE。
错误的问题确实......除非你使用这种类型的条件结构编写一个非常紧密的循环来进行100次1000次迭代。即便如此,性能差异也不会那么显着。
要问的正确问题是哪一个更灵活,并允许您之后的程序员阅读,理解和维护您的代码。在这方面,CASE
语句比DECODE
语句要好得多。
只关注性能(我建议你不要孤立地做!!),我在不同平台(HP-UX vs SUN AMD)和操作系统(HP-UX vs Linux)上使用10G Enterprise获得了混合结果。
在前者DECODE
稍快一点。对于后者,CASE
稍快一些。
使用您指定的构造并执行100,000次迭代的紧密循环,已执行的执行时间为:
DECODE
= 00:00:11.83 CASE
= 00:00:12.32 DECODE
= 00:00:02.02 CASE
= 00:00:01.84 显然,CPU架构在这里起着重要作用。 AMD被认为是市场上最好的64位CPU。 HP-UX PARISC CPU(也是64位)并没有真正比较原始性能。此外,这是一个RISC CPU,而我认为AMD CPU比RISC更多CISC。
同样有趣的是,我用于此基准测试的更快的Sun AMD / Linux服务器大约是HP-UX服务器价格的10%..并且比原始速度大约快5倍。
一项有趣的练习,但其实际价值不大。是的,表现很重要。但是在PL / SQL中,不是关于辩论CASE
或DECODE
是否更快的水平。正如我所提到的,我认为正确的问题是关于可读性和维护的问题,而不是在这种情况下的表现。
答案 1 :(得分:1)
最近我偶然发现了这个问题:https://community.oracle.com/thread/1112467?tstart=0
“性能差异非常小,以至于使用它作为是否使用CASE或DECODE的主要标准毫无意义。所以,除非你从非常紧密的循环中调用这个语句进行数百万次迭代,否则应该更适合哪种情况,CASE或DECODE,最适合需要。“