В нашем решении мы должны обновить строку, присваивая значение из последовательности. Это обновление должно соответствовать указанному порядку 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.
Знаете ли вы какой-либо другой подход к выполнению заказанного обновления, которое было бы лучше этого?
Большое спасибо!