0

テーブルのようなフォームからのデータを格納するpostgresqlテーブルがあります。

id SERIAL,
item_id INTEGER ,
date BIGINT,
column_id INTEGER,
row_id INTEGER,
value TEXT,
some_flags INTEGER,

問題は、1日あたり5000以上のエントリがあり、情報を何年も保持する必要があることです。そのため、私は巨大なテーブルウィッチが上位1000〜5000行で忙しく、SELECT、UPDATE、DELETEクエリがたくさんあることになりますが、古いコンテンツはめったに使用されず(統計でのみ)、ほとんど変更されません。

問題は、どうすれば日常業務のパフォーマンスを向上させることができるかということです(5000万から上位5000エントリ)。ほとんどすべての列に単純なインデックスがあります..しかし、派手なものは何もありません。今のところテーブルを分割することはできません。インデックスの最適化をもっと探しています。

4

1 に答える 1

2

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条件は、すでにアーカイブされている何百万もの行を更新しないようにすることです。

于 2012-12-10T14:06:58.647 に答える