2

だから、私は約8Mレコードのログテーブルを持っています。プログラミング エラーのため、同じ日付内に会社の複数のレコードが存在することが起こりました。今、必要なのは、最新(最大IDを持つ)を除く同じ日付の各会社のこのログからすべてのレコードを削除することです。削除するレコード数は約 300K。

私が試した最速で最も簡単なことはこれです

delete from indexing_log where id not in (
select max(id)
from indexing_log
group by company_id,
"date"
)

しかし、このクエリは本番サーバー (何らかの理由で ssd ドライブがない) で膨大な時間 (約 3 日) を費やしています。私は知っているすべての方法を試しましたが、アドバイスが必要です。どうすれば速くなりますか?

更新セロリタスクを介してバケツで行うことにしました。

4

4 に答える 4

2

個別の行を一時テーブルにダンプします

create temporary table t as
select distinct on (company_id, "date") *
from indexing_log
order by company_id, "date", id desc;

元を切り捨てる

truncate table indexing_log;

テーブルが空になったので、この機会を利用して瞬時にvacuum:

vacuum full indexing_log;

行を一時から元に移動します

insert into indexing_log
select *
from t;
于 2013-08-14T11:32:36.660 に答える
2

あなたが試すことができます

delete from indexing_log as l
where
    exists
    (
        select *
        from indexing_log as i
        where i.id < l.id and i.company_id = l.company_id and i.dt = l.dt
    );
于 2013-08-14T11:30:19.133 に答える
1

Not Existsよりも速い場合があるNot in

delete from indexing_log 
where not exists (select 1
                    from (select max(id) as iid
                            from indexing_log
                           group by company_id,
                                 "date") mids
                   where id = mids.iid
                 )
于 2013-08-14T11:27:11.987 に答える