在我的应用程序中,我们使用postgresql,现在它在汇总表中有一百万条记录。
当我运行以下查询时,它需要80,927毫秒
SELECT COUNT(*) AS count
FROM summary_views
GROUP BY question_id,category_type_id
有没有有效的方法可以做到这一点?
答案 0 :(得分:1)
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子句,则需要更复杂的触发器功能和计数表。