dezso
とからのコメントのアドバイスJack
は良いです。最も単純にしたい場合は、これが部分インデックスの実装方法です。
create table t ("date" bigint, archive boolean default false);
insert into t ("date")
select generate_series(
extract(epoch from current_timestamp - interval '5 year')::bigint,
extract(epoch from current_timestamp)::bigint,
5)
;
create index the_date_partial_index on t ("date")
where not archive
;
インデックス条件を追加するすべてのクエリを変更する必要がないようにするには、テーブルの名前を変更します。
alter table t rename to t_table;
インデックス条件を含む古い名前のビューを作成します。
create view t as
select *
from t_table
where not archive
;
explain
select *
from t
;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Index Scan using the_date_partial_index on t_table (cost=0.00..385514.41 rows=86559 width=9)
次に、毎日古い行をアーカイブします。
update t_table
set archive = true
where
"date" < extract(epoch from current_timestamp - interval '1 week')
and
not archive
;
not archive
条件は、すでにアーカイブされている何百万もの行を更新しないようにすることです。