2014-10-02 78 views
0

我有一个表格说tbl_test。在这张表中我有2.4 million记录。我运行以下三个非常缓慢且令人沮丧的查询。从VIEW中做SELECT是非常慢的

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秒内返回数据?

+0

你为什么认为从简单的视图(未物化视图)选择​​会更快? – 2014-10-02 11:14:34

+0

@IgorRomanchenko如果我使用Materialized视图,它会在任何时候返回结果吗? – 2014-10-02 11:51:42

回答

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索引,但是因为你没有提供执行计划,所以这几乎是不可能告诉的。

+0

感谢您的快速响应。当我在我的电脑上运行时,它说'错误:语法错误在或接近'。我有'状态'的索引,但那不是重点。我徘徊为什么实际计数查询和从视图中选择是平等的!根据我的理解,从视图中选择应该更快。 – 2014-10-02 10:31:06

+0

对不起,这是一个错字。你为什么认为从视角选择应该更快?这不是一个“单一”查询 - 它是三个查询,每个查询都是从表中再次检索行。因此,从视图中检索实际需要18秒:“count_active”查询需要9秒,“count_total”查询需要9秒。如果没有,它只是表明Postgres可以优化它。但是,再一次,因为你不提供执行计划,所以这是不可能的 – 2014-10-02 10:34:36