哪个PL / SQL语句更快?

时间:2015-12-21 20:54:09

标签: oracle plsql

哪一个是更快的搜索CASE或简单的CASE声明?

{% for i in (0..5) %}
  {% capture related_products %}top_related_products_{{i}}{% endcapture %}
  {{ recommendations[related_products].products.first.title }}
{% endfor %}

2 个答案:

答案 0 :(得分: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格式只是语法上的差异。编译解析器和编译器的最简单方法是将两个表单转换为相同的内部表示,并为每个表单调用相同的代码。如果出于某种原因,一种方法比另一种方法快得多,那么在某些时候开发人员可能会复制该代码并使它们相同。

除了罕见的错误之外,很少有地方会出现这种轻微的句法差异。人们很容易相信存在差异,因为我们都希望遵循简单的规则来使代码运行得更快。如果我们只需遵循一系列语法规则,编程就会很简单:“<>比!=”更快,“count(1)比count(*)更快”等等。但是这些例子虽然重复了很多时代,是完整的神话。

性能差异无论如何都不重要

评估CASE语句所花费的时间几乎与每个Oracle数据库无关。即使一个CASE方法的速度是另一个方法的两倍,也应该是不明显的 - 为什么Oracle无论如何都会每秒处理一次PL / SQL行数百万次?实际工作应该在SQL中完成,从硬盘驱动器读取数据的时间比评估CASE语句的微小CPU时间更重要。

答案 1 :(得分:0)

我认为如下:

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