2015-06-25 3 views
2

У меня возникла ситуация, когда мне нужно настроить функцию «Мое скалярное определение» так, чтобы она не выполнялась каждый раз при использовании в одном запросе. я прочитал и узнал, что нам нужно, чтобы использовать какДетерминированные функции в DB2

DETERMINISTIC

, а также

NO EXTERNAL ACTION

сделать детерминированную функцию работать так, чтобы он не выполняется каждый раз в запросе. Если я не ошибаюсь? также, что область детерминированного поведения представляет собой единый запрос.

Подпись Мой UDF выглядит следующим образом:

create or replace FUNCTION my_udf(myLIST VARCHAR(1000)) 
RETURNS integer 
LANGUAGE SQL 
DETERMINISTIC 
NO EXTERNAL ACTION 
BEGIN ATOMIC 
< code for making HTTP servlet call > 
END 

Я использую следующий запрос для тестирования my_udf функции():

select my_udf('admin1,admin2'),my_udf('admin1,admin2') from sysibm.sysdummy1 

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

Мне нужно знать, есть ли что-то не так, что я делаю в отношении реализации функций DETERMINISTIC или неправильного представления об их использовании/функциональности?

ответ

4

Оптимизатор запросов в конечном счете решает, может ли он «оптимизировать» вызовы детерминированного UDF. Однако в вашем случае это не имеет значения, потому что ваша функция действительно не детерминированный и делает имеет внешнее действие.

+0

Точно. 'DETERMINISTIC' сообщает механизму запроса, что ему не нужно каждый раз вызывать функцию. Но это не гарантирует, что это не будет. Вы должны включить код внутри своего UDF для кэширования ввода и вывода и решить для себя, если вам нужно переделать HTTP-вызов сервлетов. – Charles

0

В дополнение к тому, что другие говорили о DETERMINISTIC и NO EXTERNAL ACTION. Возможно, вы можете решить проблему, вложив вызов функции?

select x, x 
from (
    select my_udf('admin1,admin2') as x 
    from sysibm.sysdummy1 
) 
Смежные вопросы