0

我有一个 postgresql 表,用于存储类似表格的数据。

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

问题是我们每天有 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 回答