Моя инструкция по обновлению не выполняется - PullRequest
0 голосов
/ 29 января 2019

Можете ли вы помочь мне понять, что не так с моим заявлением об обновлении?Кажется, что выполнение запроса на обновление выполняется очень медленно.Вот код:

BEGIN
  SELECT a.policy_id,
         a.peril_cd,
         NVL (a.ri_cd, 0) ri_cd,
          e.eff_date,
          e.expiry_date,
           (  NVL (a.premium_amt, 0)
            - NVL (a.treaty_prem, 0)
            - NVL (a.facul_prem, 0))
         * (e.numerator_factor / e.denominator_factor) def_prem_amt,
            NVL (a.share_cd, 0),
            NVL (a.item_no, 0) item_no,
            NVL (a.date_tag, 0) date_tag
    BULK COLLECT INTO vv_policy_id,
         vv_peril_cd,
         vv_ri_cd,
         vv_eff_date,
         vv_exp_date,
         vv_def_prem_amt,
         vv_share_cd,
         vv_item_no,
         vv_date_tag
    FROM GIAC_RECAP_CURR_DTL_EXT a, gipi_polbasic b, giis_line c, gipi_invoice d, giac_deferred_gross_prem_pol e  --added gipi_invoice by albert 01.25.2017 (GENQA SR 5848)
   WHERE a.policy_id = b.policy_id 
     AND b.line_cd = c.line_cd
     AND a.policy_id = d.policy_id
     AND a.policy_id = e.policy_id
     AND a.line_cd = e.line_cd
     AND a.iss_cd = e.iss_cd 
     AND e.extract_year = vv_ext_yy
     AND e.extract_mm = v_ext_mm;

  IF SQL%FOUND 
  THEN     
        FORALL indx IN 1 .. vv_policy_id.COUNT
        UPDATE GIAC_RECAP_CURR_DTL_EXT
           SET eff_date = vv_eff_date (indx),
               exp_date = vv_exp_date (indx),
               def_prem_amt = vv_def_prem_amt (indx)
         WHERE     policy_id = vv_policy_id (indx)
               AND peril_cd = vv_peril_cd (indx)
               AND ri_cd = vv_ri_cd (indx)
               AND share_cd = vv_share_cd (indx)
               AND item_no = vv_item_no (indx)
               AND date_tag = vv_date_tag (indx);
   END IF;
END;

Вот информация из браузера сеансов Toad: enter image description here

Он начал загружать оператор в 16:08., но на момент написания этого (5:00 вечера) он еще не завершил выполнение.Кстати, вот план объяснения: enter image description here

Надеюсь, вы, ребята, можете мне помочь.Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Вы бы увидели лучшую производительность, объединив select и update в одном запросе, вместо того, чтобы извлекать данные из базы данных, прежде чем вставлять их обратно, например, с помощью оператора MERGE:

MERGE INTO giac_recap_curr_dtl_ext tgt
  USING (SELECT a.policy_id,
                a.peril_cd,
                NVL (a.ri_cd, 0) ri_cd,
                 e.eff_date,
                 e.expiry_date,
                  (  NVL (a.premium_amt, 0)
                   - NVL (a.treaty_prem, 0)
                   - NVL (a.facul_prem, 0))
                * (e.numerator_factor / e.denominator_factor) def_prem_amt,
                   NVL (a.share_cd, 0),
                   NVL (a.item_no, 0) item_no,
                   NVL (a.date_tag, 0) date_tag
           FROM GIAC_RECAP_CURR_DTL_EXT a, gipi_polbasic b, giis_line c, gipi_invoice d, giac_deferred_gross_prem_pol e  --added gipi_invoice by albert 01.25.2017 (GENQA SR 5848)
          WHERE a.policy_id = b.policy_id 
            AND b.line_cd = c.line_cd
            AND a.policy_id = d.policy_id
            AND a.policy_id = e.policy_id
            AND a.line_cd = e.line_cd
            AND a.iss_cd = e.iss_cd 
            AND e.extract_year = vv_ext_yy
            AND e.extract_mm = v_ext_mm) src
    ON (tgt.policy_id = src.policy_id
        AND tgt.peril_cd = src.peril_cd
        AND tgt.ri_cd = src.ri_cd -- should there be NVLs on the tgt side of things too?
        AND tgt.share_id = src.share_id -- should there be NVLs on the tgt side of things too?
        AND tgt.item_no = src.item_no -- should there be NVLs on the tgt side of things too?
        AND tgt.date_tag = src.date_tag) -- should there be NVLs on the tgt side of things too?
WHEN MATCHED THEN
  UPDATE SET tgt.eff_date = src.eff_dte,
             tgt.exp_date = src.expiry_date,
             tgt.def_prem_amt = def_prem_amt;

Вы можете улучшить производительность этого оператора, удалив таблицу giac_recap_curr_dtl_ext из подзапроса внутреннего источника, хотя я понимаю, что это может быть невозможно.

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