哪种方法更好 - CASE WHEN或DECODE

时间:2016-03-01 09:34:23

标签: sql oracle

对于一些简单的逻辑测试,可以使用CASE WHEN和DECODE语法实现相同的功能。这里有什么方法更好(需要论证/测量)?

SUM(CASE WHEN xyz=100 THEN 1 ELSE 0 END)

SUM(DECODE(xyz,100,1,0))

2 个答案:

答案 0 :(得分:2)

在多个条件检查的case中,与Case相比,Decode更易于编写。此外,Decode不能用于可能CASE的PL / SQL代码中。

同一平台上CASEDECODE之间的性能差异非常小。一个人必须运行100次1000次迭代才能看到差异,即便如此,这种差异是否仅仅归因于CASE vs DECODE还是存在争议。

CASEDECODE之间的性能似乎有所不同,具体取决于CPU的类型。在某些CPU架构上,DECODE似乎会稍快一些。在其他人看来,CASE似乎会稍快一点。

性能差异非常小,因此将其用作是否使用CASEDECODE的主要标准毫无意义。因此,除非你从一个非常紧密的循环中调用这个语句进行数百万次迭代,否则决定应该选择最适合需要的CASE或DECODE。

错误的问题确实......除非你使用这种类型的条件结构编写一个非常紧密的循环来进行100次1000次迭代。即便如此,性能差异也不会那么显着。

要问的正确问题是哪一个更灵活,并允许您之后的程序员阅读,理解和维护您的代码。在这方面,CASE语句比DECODE语句要好得多。

只关注性能(我建议你不要孤立地做!!),我在不同平台(HP-UX vs SUN AMD)和操作系统(HP-UX vs Linux)上使用10G Enterprise获得了混合结果。

在前者DECODE稍快一点。对于后者,CASE稍快一些。

使用您指定的构造并执行100,000次迭代的紧密循环,已执行的执行时间为:

  • HP-UX DECODE = 00:00:11.83
  • HP-UX CASE = 00:00:12.32
  • Linux / AMD DECODE = 00:00:02.02
  • Linux / AMD 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中,不是关于辩论CASEDECODE是否更快的水平。正如我所提到的,我认为正确的问题是关于可读性和维护的问题,而不是在这种情况下的表现。

https://community.oracle.com/thread/1112467?tstart=0

答案 1 :(得分:1)

最近我偶然发现了这个问题:https://community.oracle.com/thread/1112467?tstart=0

“性能差异非常小,以至于使用它作为是否使用CASE或DECODE的主要标准毫无意义。所以,除非你从非常紧密的循环中调用这个语句进行数百万次迭代,否则应该更适合哪种情况,CASE或DECODE,最适合需要。“