Oracle 哪个PL/SQL语句更快?

Oracle 哪个PL/SQL语句更快?,oracle,plsql,Oracle,Plsql,哪一个是更快的、搜索到的CASE语句还是简单的CASE语句 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; 我认为: 让我们认为a是你桌子上的一个字段。您的表由大量数据组成。所以

哪一个是更快的、搜索到的CASE语句还是简单的CASE语句

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;
我认为:

让我们认为a是你桌子上的一个字段。您的表由大量数据组成。所以,如果您将通过字段为表创建索引,这将是一件好事。在这种情况下,第一种方法应该工作得更快,因为它正在索引列中查找。一个原则是:你的案例陈述知道,它只对A列有效,所以他不考虑其他列。(例如,您的表由20列组成,因此您的第一条语句将只获取a列并从中进行搜索)。在第二个case语句中,它的工作方式如下:case语句不初始化任何内容,它正在等待您的条件。因此,每次读取条件时,他会一遍又一遍地搜索条件匹配(考虑所有列)。但是,如果您的表没有真正大量的数据,它对您的影响不会太大。

我认为如下:


让我们认为a是你桌子上的一个字段。您的表由大量数据组成。所以,如果您将通过字段为表创建索引,这将是一件好事。在这种情况下,第一种方法应该工作得更快,因为它正在索引列中查找。一个原则是:你的案例陈述知道,它只对A列有效,所以他不考虑其他列。(例如,您的表由20列组成,因此您的第一条语句将只获取a列并从中进行搜索)。在第二个case语句中,它的工作方式如下:case语句不初始化任何内容,它正在等待您的条件。因此,每次读取条件时,他会一遍又一遍地搜索条件匹配(考虑所有列)。但是,如果您的表没有真正大量的数据,它对您的影响不会太大。

Simple
CASE
和searched
CASE
语句同样快速

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

简单测试

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

两人的差距简直是荒谬。通常我不会期望相同的代码运行得如此一致

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

除了罕见的bug之外,很少有地方存在如此细微的语法差异。人们很容易相信这是有区别的,因为我们都希望遵循简单的规则,使代码运行得更快。如果我们只需遵循一系列语法规则:“快于!=”、“count(1)快于count(*)”等,那么编程就很简单了。但是这些示例尽管重复了很多次,但都是完全的神话

性能差异无论如何都无关紧要


在几乎所有Oracle数据库中,评估
案例
语句所花费的时间应该是无关紧要的。即使一个
CASE
方法的速度是另一个方法的两倍,它也应该是不可察觉的-无论如何,Oracle为什么要每秒处理PL/SQL行数百万次呢?真正的工作应该在SQL中完成,从硬盘读取数据的时间比计算
CASE
语句所需的极小CPU时间更重要。

Simple
CASE
和searched
CASE
语句同样快

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

简单测试

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

两人的差距简直是荒谬。通常我不会期望相同的代码运行得如此一致

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

除了罕见的bug之外,很少有地方存在如此细微的语法差异。人们很容易相信这是有区别的,因为我们都希望遵循简单的规则,使代码运行得更快。如果我们只需遵循一系列语法规则:“快于!=”、“count(1)快于count(*)”等,那么编程就很简单了。但是这些示例尽管重复了很多次,但都是完全的神话

性能差异无论如何都无关紧要


在几乎所有Oracle数据库中,评估
案例
语句所花费的时间应该是无关紧要的。即使一个
CASE
方法的速度是另一个方法的两倍,它也应该是不可察觉的-无论如何,Oracle为什么要每秒处理PL/SQL行数百万次呢?真正的工作应该在SQL中完成,从硬盘读取数据的时间比计算
案例
语句所需的极小CPU时间更重要。

对其进行基准测试。但我怀疑你是否能察觉到任何差异。请做个基准测试。但我怀疑你能做到