Настройка Выполнить немедленные операторы, присутствующие в процедурах - PullRequest
0 голосов
/ 05 июля 2018

Я хотел настроить процедуру, в которой есть ряд динамических операторов SQL, выполнение которых занимает слишком много времени. Мне нужна помощь, чтобы настроить те или иное альтернативное решение.

Пример:

EXECUTE IMMEDIATE 'CREATE TABLE C1_LAN_GTT_1 NOLOGGING PARALLEL 4 AS 
SELECT /*+INDEX(C,CR_DECISION_M_CD1)*/ A.AGREEMENTID, 
       A.AGREEMENTNO, A.LESSEEID, A.PRODUCTFLAG, A.APP_FORMNO, A.AMTFIN
FROM   LEA_AGREEMENT_DTL A, CR_DECISION_M C
WHERE  A.AGREEMENTID = C.APPID
AND    A.STATUS = ''A''
AND    TRUNC(C.AUTHDATE) BETWEEN' || '''' || P_FROM_DATE || '''' ||
                       ' AND ' || '''' || P_TO_DATE || '''';

Когда я проверял процедуру в режиме отладки в PLSQL Developer, я обнаружил, что эти динамические операторы отнимают слишком много времени.

В запросе нет данных, для выполнения которых требуется время.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Новая версия инструкции немедленного выполнения, использующая вместо соединения:

EXECUTE IMMEDIATE 'CREATE TABLE C1_LAN_GTT_1 NOLOGGING PARALLEL 4 AS 
SELECT A.AGREEMENTID, A.AGREEMENTNO, A.LESSEEID, A.PRODUCTFLAG, A.APP_FORMNO, A.AMTFIN
FROM LEA_AGREEMENT_DTL A
WHERE A.STATUS = ''A''
AND EXISTS (
  SELECT /*+INDEX(C CR_DECISION_M_CD1)*/ NULL 
  FROM CR_DECISION_M C
  WHERE C.APPID = A.AGREEMENTID
  AND TRUNC(C.AUTHDATE) BETWEEN '''||P_FROM_DATE||''' AND '''||P_TO_DATE||'''
)';
0 голосов
/ 05 июля 2018

Без дополнительных подробностей, таких как план выполнения и полные сведения о таблицах, индексах, объемах и распределении данных, я не знаю, с какими проблемами производительности вы сталкиваетесь. Тем не менее, я мог бы начать с чего-то вроде этого:

declare
    p_from_date date := date '2018-01-01';
    p_to_date   date := date '2018-02-01';

    myddl long := 'create table c1_lan_gtt_1 nologging parallel 4 as 
    select /*+index(c cr_decision_m_cd1)*/ a.agreementid, 
           a.agreementno, a.lesseeid, a.productflag, a.app_formno, a.amtfin
    from   lea_agreement_dtl a
           join cr_decision_m c on c.appid = a.agreementid
    where  a.status = ''A''
    and    c.authdate between date ''' || to_char(p_from_date,'YYYY-MM-DD') || '''' ||
                    ' and date '''     || to_char(p_to_date,'YYYY-MM-DD') || '''';
begin
    dbms_output.put_line(myddl);
end;

, который генерирует

create table c1_lan_gtt_1 nologging parallel 4 as 
    select /*+index(c cr_decision_m_cd1)*/ a.agreementid, 
           a.agreementno, a.lesseeid, a.productflag, a.app_formno, a.amtfin
    from   lea_agreement_dtl a
           join cr_decision_m c on c.appid = a.agreementid
    where  a.status = 'A'
    and    trunc(c.authdate) between date '2018-01-01' and date '2018-02-01'

Редактировать: , так как индекс CR_DECISION_M_CD1 включен (APPID, TRUNC(AUTHDATE)) (из комментариев) Я восстановил функцию trunc(), хотя по логике она не нужна.

0 голосов
/ 05 июля 2018

Проверьте, что P_FROM_DATE и P_TO_DATE являются переменными связывания введите описание ссылки здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...