2015-12-21 67 views
0

哪一个更快,搜索CASE或简单的CASE语句?哪个PL/SQL语句更快?

xx := case a 
     when 'x' then 'b' 
     when 'y' then 'c' 
     else 'z' 
     end; 

xx := case 
     when a='x' then 'b' 
     when a='y' then 'c' 
     else 'z' 
     end; 
+8

基准。但是我怀疑你完全可以察觉到任何差异。 – sstan

回答

4

简单CASE搜查CASE语句是一样快。

性能比较是困难的,即使是这样一个简单的问题。我的回答基于以下三个原因。

简单测试

下面的两个匿名块运行不同类型的case语句。它们运行5次(以排除由“冷”系统引起的任何极端情况)并交替运行(以确保系统活动不会仅仅不公平地影响一种类型)。

set serveroutput on; 

--Simple CASE. 
declare 
    a varchar2(100) := 'z'; 
    b varchar2(1); 
begin 
    for i in 1 .. 40000000 loop 
     a := i; 
     b := case a when 'x' then 'b' when 'y' then 'c' else 'z' end; 
    end loop; 
end; 
/

--Searched CASE. 
declare 
    a varchar2(100) := 'z'; 
    b varchar2(1); 
begin 
    for i in 1 .. 40000000 loop 
     a := i; 
     b := case when a='x' then 'b' when a='y' then 'c' else 'z' end; 
    end loop; 
end; 
/

奔跑是荒谬的接近。通常我不希望即使是相同的代码运行如此一致。

--Simple CASE 
Elapsed: 00:00:11.04 
Elapsed: 00:00:11.00 
Elapsed: 00:00:11.04 
Elapsed: 00:00:10.99 
Elapsed: 00:00:10.99 

Average: 11.012 

--Searched CASE 
Elapsed: 00:00:11.04 
Elapsed: 00:00:10.98 
Elapsed: 00:00:11.00 
Elapsed: 00:00:10.99 
Elapsed: 00:00:11.02 

Average: 11.006 

的性能差异就没有意义

不同CASE格式只是语法差异。编程解析器和编译器的最简单方法是将两个表单翻译成相同的内部表示形式,并为每个表单调用相同的代码。如果由于某种原因,一种方法比另一种方法快得多,在某些情况下,开发人员可能会复制该代码并使其相同。

除了罕见的错误,也有少数地方这样小的语法上的不同关系。很容易相信这种差异,因为我们都希望遵循简单的规则来使代码运行得更快。编程会简单,如果我们可以只要按照语法规则列表:“<>比=更快”,“计数(1)比COUNT(*)快”等,但这些例子,虽然反复多次,是完全的神话。

的性能差异也没有什么关系反正

所花时间评估CASE声明应在几乎每一个Oracle数据库是不相关的。即使一个CASE方法比另一个慢两倍,它应该是不明显的 - 为什么甲骨文无论如何都会每秒处理一次PL/SQL数百万次?真正的工作应该在SQL中完成,从硬盘读取数据的时间比评估CASE声明的CPU时间的微不足道更重要。

+1

100%同意。 PL/SQL程序员需要认识到它不是C,这种微观优化没有余地。任何优化都应该在程序的瓶颈(通常是一个长期运行的SQL,恕我直言)中完成,那里将会有任何实际的性能优势。 – toddlermenot

+0

换句话说:在开发人员和未来的开发人员浪费时间的情况下,CPU在整个产品生命周期内节省的时间可能会大大超过几个数量级,因为代码得以维护。 –

0

我认为如下:

我们认为一个在你的表中的字段。您的表格由大量数据组成。所以这将是很好的,如果你将创建a字段的索引。在这种情况下,第一种方式应该更快,因为它正在索引列中查找。宗旨是:你的case语句都知道,它只会用一个列工作,所以他不想想其他列。 (例如,您的表包含20列,所以你的第一条语句将只列一个并从中搜索)。在第二种情况下,它的工作原理如下:案例陈述不会初始化任何东西,它正在等待您的情况。所以每次读取条件时,他都会一次又一次搜索条件匹配(它考虑所有列)。但是,如果你的桌子上没有真正的大量数据,那么它对你没有太大的影响。

+0

你在推翻它。 OP的例子中没有查询。所以这里不涉及列和/或索引。 – sstan

+0

@sstan这就是为什么我说“让我们认为a是桌子上的领域”,而不是“a是桌子上的领域,所以......” – Khazratbek