Функция рефакторинга для SQL-запроса - PullRequest
0 голосов
/ 18 мая 2018

Короче говоря, у нас есть эта функция ... это ФУНКЦИЯ.
Она называется '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 имеет какой-либо опыт с этим?

1 Ответ

0 голосов
/ 19 мая 2018

Как насчет этого: экспортировать приложение.Результатом будет файл .SQL - файл textual , который можно открыть в любом текстовом редакторе.Сделай это.Выполните поиск / замену.

Затем удалите (*) приложение и импортируйте его из измененного файла .SQL.

(*) Удалите ... с осторожностью.Я бы посоветовал вам сначала попробовать его на тестовом рабочем пространстве, а не на производстве, на всякий случай .

...