Повышение производительности хранения трех последних записей каждого запроса учетной записи - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть таблица в базе данных 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 миллиона, причем примерно половину из них следует удалить.

Есть ли способ улучшить производительность этого?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2010

Вместо создания пустой таблицы и заполнения в режиме RBAR создайте таблицу с нужными строками ....

CREATE TABLE ACCOUNT_TRANSACTION_TMP NOLOGGING AS 
SELECT account_id, col1, col2, col3, transaction_time from
    ( select at.*
             , row_number()
                  over (partition by at.account_id 
                         order by at.transaction_time desc) as to_keep
 FROM ACCOUNT_TRANSACTION at)
where to_keep <= 3
/

Затем перейдите прямо к переименовываемой части вашего плана.

0 голосов
/ 04 февраля 2010

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

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1212501913138

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