У меня есть таблица в базе данных Oracle (10g XE), и я собираюсь очистить ее и сохранить только три последние записи каждой учетной записи.Вот что я делаю прямо сейчас:
CREATE TABLE ACCOUNT_TRANSACTION_TMP NOLOGGING AS SELECT * FROM ACCOUNT_TRANSACTION WHERE 1=2;
DECLARE
CURSOR mbsacc_cur (account_id_var account_transaction.account_id%TYPE) IS
SELECT * FROM account_transaction WHERE account_id = account_id_var ORDER BY transaction_time DESC;
account_transaction_rec account_transaction%ROWTYPE;
BEGIN
FOR i IN (SELECT DISTINCT(account_id) FROM account_transaction) LOOP
OPEN mbsacc_cur(i.account_id);
LOOP
FETCH mbsacc_cur INTO account_transaction_rec;
EXIT WHEN mbsacc_cur%NOTFOUND OR mbsacc_cur%ROWCOUNT > 3;
INSERT /*+ append */ INTO account_transaction_tmp VALUES account_transaction_rec;
END LOOP;
CLOSE mbsacc_cur;
END LOOP;
END;
/
А потом я отброшу старую таблицу, переименую новую в старую и добавлю ограничения.
Но проблема в том,Приведенный выше код работает вечно (~ 3-4 часа) для записи около 1 миллиона, причем примерно половину из них следует удалить.
Есть ли способ улучшить производительность этого?