Oracle Упорядоченное обновление - лучший подход / бесплатное ожидание защелки - PullRequest
1 голос
/ 24 апреля 2020

В нашем решении мы должны обновить строку, присваивая значение из последовательности. Это обновление должно соответствовать указанному порядку c, поэтому мы использовали следующий подход:

PROCEDURE P_RID_SELLERS_RETAIL (pCustomerID IN NUMBER, pCompanyID IN NUMBER)
IS
  CURSOR SYNC_CURSOR
  IS
       SELECT RECORD_ID
         FROM SALES_SCH.SYNC_SELLERS_RETAIL
        WHERE CUSTOMER_ID = pCustomerID AND COMPANY_ID = pCompanyID AND RECORD_ID < 0
     ORDER BY RECORD_ID;

  TYPE RECORD_ID_AAT IS TABLE OF SALES_SCH.SYNC_SELLERS_RETAIL.RECORD_ID%TYPE
     INDEX BY PLS_INTEGER;

  L_RECORD_ID_AAT   RECORD_ID_AAT;
BEGIN
  OPEN SYNC_CURSOR;

  LOOP
     FETCH SYNC_CURSOR BULK COLLECT INTO L_RECORD_ID_AAT LIMIT 100000;

     EXIT WHEN L_RECORD_ID_AAT.COUNT = 0;

     FORALL i IN L_RECORD_ID_AAT.FIRST .. L_RECORD_ID_AAT.LAST
        UPDATE SALES_SCH.SYNC_SELLERS_RETAIL
           SET RECORD_ID = RECORD_ID.NEXTVAL
         WHERE RECORD_ID = L_RECORD_ID_AAT (i);

     COMMIT;
  END LOOP;

  CLOSE SYNC_CURSOR;
END;

Иногда, когда существует большое количество данных, необходимо обновить (большой = более 1 миллиона строк) мы начинаем заниматься проблемами производительности, в основном событием Latch Free Wait.

Знаете ли вы какой-либо другой подход к выполнению заказанного обновления, которое было бы лучше этого?

Большое спасибо!

...