2016-06-08 85 views
0

我在Oracle中有这个where子句条件来检查与给定值相似的名称,但它返回正确的结果,但运行速度非常慢。有没有更有效的方法来执行这种情况?谢谢。Slow Oracle执行

AND 
    (P5_ORGN_NAME IS NULL OR 

(D.ORGANIZATION_NAME LIKE '' || upper(P5_ORGN_NAME) || '%' OR D.FORMATTED_ORGANIZATION_NAME like 
'' || local.pkg.orgname_format(upper(P5_ORGN_NAME)) || '%') 
) 
+1

你看执行计划吗?它说了什么? – nvoigt

+2

您想要查看的第一件事是从WHERE子句中删除此调用'local.pkg.orgnameformat(upper(P5_ORGN_NAME))'。在WHERE子句中调用PL/SQL通常是性能杀手。 –

+0

运行解释计划,看看发生了什么。如果您必须使用此orgname_format函数,请查看基于函数的索引。 – OldProgrammer

回答

2

充分利用pkg.orgname_format功能DETERMINISTIC所以Oracle知道不要一遍又一遍地运行它的每一行。

在你local.pkg包...

FUNCTION orgname_format (p_org_name VARCHAR2) 
    RETURN VARCHAR2 DETERMINISTIC IS 
BEGIN 
    ... 
END; 

这将告诉Oracle的功能始终返回相同的输入参数相同的数值。知道这一点,Oracle可以执行一次函数,而不是为查询中的基础表中的每一行执行该函数。

当然,如果函数真的是确定性的,听起来就像是这样,根据它的名称判断,你只能使用它。

+0

这是否工作? –

+0

谢谢马修!它现在非常快:) – amaach