Slow Oracle执行
问题描述:
我在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)) || '%')
)
答
充分利用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
你看执行计划吗?它说了什么? – nvoigt
您想要查看的第一件事是从WHERE子句中删除此调用'local.pkg.orgnameformat(upper(P5_ORGN_NAME))'。在WHERE子句中调用PL/SQL通常是性能杀手。 –
运行解释计划,看看发生了什么。如果您必须使用此orgname_format函数,请查看基于函数的索引。 – OldProgrammer