4

ORACLE 数据库中最快的是什么?

在 select 语句中调用函数以检索每一行的单个值

SELECT field1, field2, F_GET_LIBELLE_STATUT( field2 ) FROM table1 WHERE ...

使用简单的功能:

create or replace
FUNCTION "F_GET_LIBELLE_STATUT" (v_statut NUMBER) RETURN VARCHAR2 IS
tmpVar VARCHAR2(40);
BEGIN
   select libelle into tmpVar from t_statut_ope where id_statut = v_statut;
   RETURN tmpVar;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       RETURN '';
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END f_get_libelle_statut;

还是在选择语句中加入?

Select a.field1, a.field2, b.libelle
FROM table1 a LEFT JOIN t_statut_ope b ON b.id_statut = a.field2
WHERE ...

如果我在选择和子句条件中调用很多函数(十个或更多),答案是否相同?

感谢您的回答。

4

4 回答 4

9

任何可以在 SQL 中完成的事情都应该在 SQL (*)中完成。

连接总是比调用该函数快,因为基于集合的操作总是比通过痛苦的行快。然后你有在 SQL 和 PL/SQL 之间移动的开销。加上处理那些 NO_DATA_FOUND 异常的开销,这些异常并不是真正的异常,因为间隙是预期和容忍的。最后,优化器将为纯 SQL 选项选择一个更好的计划,因为您已经为它提供了它需要的所有信息。


(*)我早在很久以前就回答了这个问题,我回答的重点是给出的例子,我支持这个答案。如果我们可以使用 SQL 对表(通过连接、视图、内联视图、子查询)获取我们需要的数据,那么我们应该这样做。但我想深入探讨一个根本问题:为什么 Oracle 支持在查询中使用函数?因为有时我们需要做一些我们在 SQL 中做不到的事情。

以下是调用执行 SQL 的函数(我主要考虑通过table()调用调用的函数)而不是使用连接(或其他 SQL 构造,如内联视图、WITH 子句)的用例:

  1. 查询是动态的。动态 SQL 需要 PL/SQL,所以函数是你这里唯一的人。
  2. 行生成。使用 PL/SQL 将输入拆分为多个字符串(例如 CSV 标记),或者生成数据,而不是从表中生成数据。偶尔仍然有效,但正则表达式支持和漂亮的 CONNECT BY LEVEL <= N 技巧已经将更常见的用法分箱了。
  3. 数据被封装在一个 PL/SQL API 后面,所以我们只能调用一个函数。
  4. 出于某种奇怪的原因,我们只能通过使用 PL/SQL 实现过滤器或查找来获得所需的性能。显然。老实说,我不记得我必须这样做并且它起作用的案例(尽管我有一些案例将流水线函数转换为子查询或内联视图提高了性能)。也许我过着隐蔽的生活。当然,我欢迎对反例进行基准引用。
于 2012-05-03T09:32:28.013 回答
2

在极少数情况下,函数方法是最佳的,默认情况下我不会使用它。联接是数据库的设计目的,因此它们应该是您的首选。

于 2012-05-03T09:42:08.890 回答
1

您使用这两个不同的查询发现了什么?

根据我的经验,连接比函数快 10 倍中的 9 倍。至少当您在函数中访问另一个查询/表/视图时。该函数需要在每次运行时进行评估,连接可能会生成更大的数据集,但可以执行得更好,因为它只需要连接表(在键上),这非常快。

于 2012-05-03T06:59:40.910 回答
0

或者忘记外连接并将执行翻译的选择语句放在选择列表中[这有时比外连接更快]:

SELECT field1, field2
, (select libelle from t_statut_ope b where b.id_statut = a.field2) libelle
FROM table1 a
WHERE 1=1
;
于 2012-05-03T14:48:14.883 回答