postgres从表有效的方式计数

时间:2014-04-04 18:57:20

标签: postgresql

在我的应用程序中,我们使用postgresql,现在它在汇总表中有一百万条记录。

当我运行以下查询时,它需要80,927毫秒

SELECT COUNT(*) AS count
FROM summary_views
GROUP BY question_id,category_type_id

有没有有效的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

PostgreSQL中的

COUNT(*)往往很慢。这是MVCC的一个特征。该问题的解决方法之一是使用帮助程序表的行计数触发器:

create table table_count(
        table_count_id text primary key,
        rows int default 0
);

CREATE OR REPLACE FUNCTION table_count_update()
RETURNS trigger AS
$BODY$
begin
    if tg_op = 'INSERT' then
        update table_count set rows = rows + 1 
            where table_count_id = TG_TABLE_NAME;
    elsif tg_op = 'DELETE' then
        update table_count set rows = rows - 1 
            where table_count_id = TG_TABLE_NAME;
    end if;
    return null;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

下一步是为您要使用的每个表添加适当的触发器声明。例如表tab_name

begin;
insert into table_count values 
    ('tab_name',(select count(*) from tab_name));

create trigger tab_name_table_count after insert or delete
on tab_name for each row execute procedure table_count_update();
commit;

在初始计数和触发器创建之间删除或插入的情况下,在事务块中运行以保持实际计数和帮助程序表同步非常重要。交易保证这一点。从现在开始立即获取当前计数,只需调用:

select rows from table_count where table_count_id = 'tab_name';

编辑:如果是group by子句,则需要更复杂的触发器功能和计数表。