2016-05-13 16 views
1

我注意到在執行常規查詢和創建數據庫視圖並查詢視圖時,查詢計劃存在很大差異。對數據庫視圖的過濾比直接查詢慢得多

情況1基本查詢:

SELECT <somequery> WHERE <some-filter> <some-group-by> 

情況下2數據庫視圖:

CREATE VIEW myview AS SELECT <some-query> <some-group-by>; 
SELECT FROM myview WHERE <some-filter>; 

我注意到,在案件2個Postgres將加入/總千方百計,才把它應用過濾。在情況1中,它不會觸及用where子句過濾出的行。所以案例2慢得多。

在保持數據庫視圖的同時,是否有任何技巧可以解決這個問題?

+0

在一般情況下,我不相信這一點(在PG中,視圖被視爲一個宏,並在選擇一個計劃之前與封閉查詢混合在一起)。你確定這些查詢在邏輯上是相同的嗎?你能否在你的問題中添加一個*具體*例子來顯示這種行爲?一個例外可能是geqo(這個查詢的範圍表有多大?) – joop

回答

0

您的視圖必須重新創建要從每次執行SELECT FROM過濾的數據集。

最簡單的方法是將視圖更改爲物化視圖。如果您的數據每2分鐘不發生變化,則物化視圖將保存要使用的選擇,您的過濾器可以在「保存」數據集上工作。你可以做的第二件事是在視圖上添加索引。

例子這裏:https://hashrocket.com/blog/posts/materialized-view-strategies-using-postgresql

create materialized view matview.account_balances as 
select 
    name, 
    coalesce(
    sum(amount) filter (where post_time <= current_timestamp), 
    0 
) as balance 
from accounts 
    left join transactions using(name) 
group by name; 

create index on matview.account_balances (name); 
create index on matview.account_balances (balance); 

這是爲了減少您的查詢的運行時間最簡單的方法。 希望這有助於。

相關問題