Как заставить меня сделать эту процедуру быстрее? - PullRequest
0 голосов
/ 06 ноября 2018

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

Могу ли я сделать это быстрее, я пытаюсь выполнить соединение не с помощью ',', а с помощью 'join', но у меня есть некоторые ошибки. может кто-нибудь помочь

Это мой SQL:

create or replace PROCEDURE G_TICKETS_BY_STATO_CHIUSO(USERIDRICHIEDENTEP IN VARCHAR2, result_cursor OUT SYS_REFCURSOR)

IS
    rc SYS_REFCURSOR;

BEGIN

    OPEN rc FOR SELECT DISTINCT  T.ID, a.NOME, a.COGNOME, T.OPERAZIONE 
    FROM TICKET_NOTIFICE T, RICOVERO r, ANAGRAFICA a ,PS_METADATA M,AMB_IMPEGNATIVE C, AMB_METADATA D
    WHERE (T.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and  T.stato = '1' and T.NOTIFICATION='0' AND REGEXP_SUBSTR (T.NOSOLOGICO, '[^AMB_]+$',1,1)=C.ID_AMB_METADATI AND
    C.ID_AMB_METADATI=D.ID_AMB_METADATI AND D.IDASSISTITO=a.IDASSISTITO)
   OR (T.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and  T.stato = '1' and T.NOTIFICATION='0' AND T.NOSOLOGICO=r.NOSOLOGICO AND r.IDANAGRAFICA=a.ID ) 
   or (T.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and  T.stato = '1' and T.NOTIFICATION='0' AND REGEXP_SUBSTR (T.NOSOLOGICO, '[^PS_]+$',1,1)=M.EPISODIOPSNUM AND M.IDANAGRAFICA=a.ID);

    result_cursor := rc;

END;

Таблица выглядит так, а данные для пользователя следующие: enter image description here

1 Ответ

0 голосов
/ 06 ноября 2018

Не уверен, что вы создаете декартово произведение по вашему запросу. По сути, вы можете объединить три разных запроса.

select distinct t.id
               ,a.nome
               ,a.cognome
               ,t.operazione
  from ticket_notifice t
      ,anagrafica      a
      ,amb_impegnative c
      ,amb_metadata    d
 where t.useridrichiedente = useridrichiedentep
   and t.stato = '1'
   and t.notification = '0'
   and regexp_substr(t.nosologico, '[^AMB_]+$', 1, 1) = c.id_amb_metadati
   and c.id_amb_metadati = d.id_amb_metadati
   and d.idassistito = a.idassistito
union
select distinct t.id
               ,a.nome
               ,a.cognome
               ,t.operazione
  from ticket_notifice t
      ,ricovero        r
      ,anagrafica      a
 where t.useridrichiedente = useridrichiedentep
   and t.stato = '1'
   and t.notification = '0'
   and t.nosologico = r.nosologico
   and r.idanagrafica = a.id
union
select distinct t.id
               ,a.nome
               ,a.cognome
               ,t.operazione
  from ticket_notifice t
      ,anagrafica      a
      ,ps_metadata     m
 where t.useridrichiedente = useridrichiedentep
   and t.stato = '1'
   and t.notification = '0'
   and regexp_substr(t.nosologico, '[^PS_]+$', 1, 1) = m.episodiopsnum
   and m.idanagrafica = a.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...