Запрос на обновление Oracle - курсор - PullRequest
0 голосов
/ 28 июня 2018

Я хочу обновить FirstTable из SecondTable, но есть много сложностей. Это основной запрос:

UPDATE x.FirstTable Table1
set Table1.UpdatedColumn = (
  SELECT Table2.V_PROD_CODE
  FROM y.SecondTable Table2
  WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1
  AND Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2
  AND Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3
  AND  Table2.c_Date between '17-Apr-2018' and '27-Apr-2018'
  AND Table2.c_DATE = Table1.c_date)
WHERE Table1.c_date between '17-Apr-2018' and '27-Apr-2018'
AND length(Table1.xx_v_account_id1) = 12;

Это занимает слишком много времени, поэтому я подумал о создании курсора:

create or replace procedure wco as
  cursor UpdateCursor is 
    SELECT Table2.V_PROD_CODE
    FROM y.SecondTable Table2
    INNER JOIN x.FirstTable Table1 on SUBSTR(Table1.V_CAST_REF_CODE, 6, 8) = SUBSTR(Table2.V_CAST_REF_CODE, 6, 8)
    WHERE Table2.XX_PRODUCT_CODECCOUNT_ID1 = Table1.XX_PRODUCT_CODECCOUNT_ID1
    AND Table2.XX_PRODUCT_CODECCOUNT_ID2 = Table1.XX_PRODUCT_CODECCOUNT_ID2
    AND Table2.XX_PRODUCT_CODECCOUNT_ID3 = Table1.XX_PRODUCT_CODECCOUNT_ID3
    AND  Table2.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
    AND Table2.c_DATE = Table1.c_date
for update;
    v_PRODUCT_CODE Table2.V_PROD_CODE%type;

begin
  open UpdateCursor;
  loop
    fetch UpdateCursor into v_PRODUCT_CODE;
    exit when UpdateCursor%notfound;

    update XXBADWH.xxba_dwh_instrument_master INST
    set INST.v_product_code = v_PRODUCT_CODE 
    WHERE current of UpdateCursor
    AND INST.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
    AND length (INST.xx_v_account_id1) = 12;
  end loop;

  close UpdateCursor;
end;


exec wco;

drop procedure wco;

Что не так с запросом? а какие-нибудь лучшие практики?

1 Ответ

0 голосов
/ 28 июня 2018

Для этого запроса:

UPDATE x.FirstTable Table1
    SET Table1.UpdatedColumn = (
            SELECT Table2.V_PROD_CODE
           FROM y.SecondTable Table2
           WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1 AND
                 Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2 AND
                 Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3 AND
                 Table2.c_Date between DATE '2018-04-17'  and DATE '2018-04-27' AND
                 Table2.c_DATE = Table1.c_date
          )
WHERE Table1.c_date between DATE '2018-04-17' and DATE '2018-04-27' AND
      length(Table1.xx_v_account_id1) = 12;

Вам нужны индексы на Table1(length(xx_v_account_id1), c_date) и Table2(XX_V_ACCOUNT_ID1, XX_V_ACCOUNT_ID2, XX_V_ACCOUNT_ID3, c_DATE).

Я бы начал с индексов (проверено на select операторе выбора). Курсоры редко являются путём улучшения производительности.

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