优化SQL查询:调用函数还是进行连接?

时间:2012-05-03 06:56:47

标签: sql oracle query-optimization

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语句中进行连接?

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

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

感谢您的回答。

4 个答案:

答案 0 :(得分:6)

在SQL中可以完成的任何操作都应该在SQL中完成。连接总是比调用该函数更快,因为基于集合的操作总是比按行激活行更快。然后你有SQL和PL / SQL之间的上下文切换的开销。加上处理那些NO_DATA_FOUND异常的开销,这些异常并非真正的异常,因为预期和容忍了缺口。最后,优化器将为纯SQL选项选择一个更好的计划,因为您已经为它提供了所需的所有信息。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您使用这两个不同的查询找到了什么?

根据我的经验,连接速度比功能快10倍。至少在您访问函数中的另一个查询/表/视图时。每次运行都需要对函数进行求值,连接可能会生成更大的数据集,但可以更好地执行,因为它只需要加入表(在键上),这非常快。

答案 3 :(得分:0)

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

SELECT field1, field2
, (select libelle from t_statut_ope b where b.id_statut = a.field2) libelle
FROM table1 a
WHERE 1=1
;