Короче говоря, у нас есть эта функция ... это ФУНКЦИЯ.
Она называется 'get_user_id'
Что она делает, это получает информацию из контекста о входе в apex и затем выбирает user_id из нашего пользовательского аутентификацииТаблица.
Эта функция имеет примерно 5 лет или даже больше, потому что я могу видеть пользователя APEX_030200 в списке пользователей базы данных, и наш администратор БД сказал, что он создал его, когда проверял Apex для использования в компании.
create or replace function get_user_id return number as
client_info VARCHAR2(1000);
rezult number;
x_user varchar2(512);
begin
-- return 1;
DBMS_APPLICATION_INFO.READ_CLIENT_INFO ( client_info );
x_user := substr(client_info,INSTR(client_info, ':' ,3,1)+1) ;
select user_id
into rezult
from USERS
where upper(login) = upper(x_user) ;
RETURN rezult ;
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
end;
Итак, да ... Я попытался выполнить этот запрос:
select * from (0,5 x 10^6 rows ) where user_id = get_user_id;
и нашему серверу потребовалось около 2 минут, чтобы не возвращать строки
Я начал читать об оптимизации функций ви т. д., и я решил, что я могу уменьшить его до 0,1 сек просто:
select * from (0,5 x 10^6 rows ) where user_id = (select get_user_id from dual );
, а затем я начал анализировать то, что на самом деле внутри функции, лицо ладонью, итолько что сделал
select * from (0,5 x 10^6 rows )
where user_id in (
select user_id from users
where upper(login) = nvl(upper(:APP_USER),'SYSTEM')
)
Время запроса: 0,03 сек.
Проблема решена ... но
Вот мой вопрос
Есть ли достойный способ изменить все экземпляры sqlв Apex Raports / источники элементов и просмотры БД от
get_user_id
до
(
select user_id from users
where upper(login) = nvl(upper(:APP_USER),'SYSTEM')
)
Редактировать:
I`Я думаю об обновлении внутренних таблиц apex any1 имеет какой-либо опыт с этим?