gpt4 book ai didi

sql - 优化一条 SQL 查询 : call a function or do a join?

转载 作者:行者123 更新时间:2023-12-04 23:47:57 25 4
gpt4 key购买 nike

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 ...

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

感谢您的回答。

最佳答案

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

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

  • 查询是动态的。动态 SQL 需要 PL/SQL,所以函数是你这里唯一的人。
  • 行生成。使用 PL/SQL 将输入拆分为多个字符串(例如 CSV 标记),或者生成数据,而不是从表中生成数据。偶尔仍然有效,但正则表达式支持和漂亮的 CONNECT BY LEVEL <= N 技巧已经将更常见的用法分箱了。
  • 数据被封装在一个 PL/SQL API 后面,所以我们只能调用一个函数。
  • 出于某种奇怪的原因,我们只能通过使用 PL/SQL 实现过滤器或查找来获得所需的性能。显然。老实说,我不记得我必须这样做并且它起作用的案例(尽管我有一些案例将流水线函数转换为子查询或内联 View 提高了性能)。也许我过着隐蔽的生活。当然,我欢迎对反例进行基准引用。
  • 关于sql - 优化一条 SQL 查询 : call a function or do a join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426563/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com