从VIEW执行SELECT非常慢

时间:2014-10-02 10:09:13

标签: postgresql

我有一张表tbl_test。在此表中,我有2.4 million条记录。我运行以下三个非常非常缓慢和令人沮丧的查询。

select count(*) from tbl_test;
-- 2.4 mil records in ~9 seconds

select count(*) from tbl_test where status = 'active';
-- 2.4 mil records in ~9 seconds

select count(*) from tbl_test where status = 'inactive';
-- 0 records in ~0 seconds

我使用以下查询创建了一个名为view_tbl_test的视图:

create view view_tbl_test as 
  select * from 
   (select count(*) count_active from tbl_test where status = 'active' ) x,
   (select count(*) count_inactive from tbl_test where status = 'inactive' ) y,
   (select count(*) count_total from tbl_test) z

现在,我只从视图中选取单行,并且像以前一样花费相同的时间。

select * from view_tbl_test limit 1;

我在这里做错了吗?是否有任何方法可以使视图在~0秒内返回数据?

1 个答案:

答案 0 :(得分:0)

您的语句在表格上运行三个选择。这可以通过一个语句来完成:

create view view_tbl_test 
as 
select count(case when status = 'active' then 1 end) as count_active
       count(case when status = 'inactive' then 1 end) as count_inactive, 
       count(*) as count_total
from tbl_test;

这应该在约。 9秒,因为它基本上与您的第一个语句相同。

最后一句话可能很快,因为你在status上有一个索引,但由于你没有提供执行计划,这几乎是不可能的。