2016-06-08 2 views
0

У меня есть условие where where в Oracle, чтобы проверить имена, похожие на заданное значение, оно возвращает правильные результаты, однако оно работает очень медленно. Есть ли более эффективный способ выполнить это условие? Благодарю.Медленное выполнение 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

Первое, что вы хотите посмотреть, это избавиться от этого вызова 'local.pkg.orgname_format (upper (P5_ORGN_NAME))' из предложения WHERE. Вызов PL/SQL в предложении WHERE часто является убийцей производительности. –

+0

запустите план объяснения, чтобы узнать, что происходит. Если вы ДОЛЖНЫ использовать эту функцию orgname_format, посмотрите на функциональный индекс. – OldProgrammer

ответ

2

сделать функцию pkg.orgname_formatDETERMINISTIC так Oracle знает, не запускать его снова и снова для каждой строки.

В вашем local.pkg пакете ...

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

Это покажет Oracle, что функция всегда возвращает то же значение для того же значения входного параметра. Зная, что Oracle может выполнять функцию один раз, а не выполнять ее для каждой строки в базовой таблице (таблицах) в вашем запросе.

Конечно, вы можете использовать это, только если функция действительно детерминирована, что звучит так, как есть, судя по ее названию.

+0

Это работало? –

+0

Спасибо, Мэтью! это очень быстро сейчас :) – amaach

Смежные вопросы