2014-10-02 81 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